6

问题:当 QMainWindow 或 QDialog 的相应 .ui 文件在 Qt Designer 中被更改时,必须清理并重建整个项目才能使这些更改生效:make clean然后make. 如果没有先清理项目,则更改不会反映在可执行文件中。

项目结构

./
    project.pro
./include/
    MainWindow.h
    Main.h
./src/
    MainWindow.cpp
    Main.cpp
./ui/
    MainWindow.ui

来源

主窗口.h:

#include <QMainWindow>
#include "ui_MainWindow.h"

class MainWindow : public QMainWindow, private Ui::MainWindow
{
    Q_OBJECT
    public:

    MainWindow();
};

主窗口.cpp:

#include "MainWindow.h"

MainWindow::MainWindow()
{
    Ui::MainWindow::setupUi(this);
}

项目.pro:

TEMPLATE = app
CONFIG -= debug release
CONFIG += qt debug_and_release warn_on incremental flat link_prl embed_manifest_dll embed_manifest_exe
QT += xml xmlpatterns

INCLUDEPATH += include/
UI_DIR = include/

FORMS += ui/MainWindow.ui
HEADERS += include/MainWindow.h include/Main.h
SOURCES += src/MainWindow.cpp src/Main.cpp

注意:为简洁起见,包括警卫和班级成员已被删除。

更新

假设我们在 Designer 中编辑 MainWindow.ui,保存它并运行 a make,将执行以下 shell 命令(在 Windows 平台上;同样的命令也在 'nix 框上执行):

QTDIR\bin\uic.exe ui\MainWindow.ui -o include\ui_MainWindow.h
QTDIR\bin\moc.exe ... include\MainWindow.h -o build\moc\moc_MainWindow.cpp
MSVS\bin\cl.exe /c ... -Fobuild\obj\ moc_MainWindow.cpp 
MSVS\bin\link.exe ... /OUT:bin\target.exe

uic头生成器已运行,并且窗口已被移动。尽管如此,该窗口在可执行文件中保持不变。

更新#2

我在 Makefile 中找到了这些行:

####### Compile

build\obj\MainWindow.obj: src\MainWindow.cpp

build\obj\main.obj: src\main.cpp

build\obj\moc_MainWindow.obj: build\moc\moc_MainWindow.cpp 

答对了。MainWindow.obj理所当然地依赖于MainWindow.cpp,但不依赖于moc_MainWindow.cpp。更改第一行以build\obj\MainWindow.obj: src\MainWindow.cpp build\moc\moc_MainWindow.cpp纠正整个问题。

但是:下次我运行qmake它会阻止我。我可以在 qmake 中输入什么来永久修复此问题?

4

3 回答 3

0

我相信您的 UI_DIR 应该设置为 ui,而不是包含。

于 2013-03-01T16:08:59.600 回答
0

有趣的是,您从配置中删除了“release”和“debug”,然后将“debug_and_release”添加到配置中。运行 debug_and_release 会添加这两个配置,但会在 CONFIG 中交换它们的顺序。

听起来这不会触发您看到的依赖问题,但就我而言,值得一试。

顺便说一句,您可以随时尝试 qmake,而不会破坏您的 Makefile。只需运行“qmake -o Makefile.foo”,它就会将其保存到另一个文件中。

于 2013-05-07T15:12:48.637 回答
0

我一直在努力解决这样的问题并发现,DEPENDPATH需要用生成的文件/项目头指向所有目录。否则 qmake 可能会在 Makefile 中生成依赖项时跳过一些头文件。尝试添加DEPENDPATH += include您的 .pro 文件

于 2016-03-29T13:56:01.997 回答