2013-02-15 44 views
6

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

中的项目结构

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

来源

MainWindow.h:

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

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

    MainWindow(); 
}; 

MainWindow.cpp:

#include "MainWindow.h" 

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

project.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 

注:包括警卫和类成员被剥夺了为简洁。

更新

假设我们在设计编辑MainWindow.ui,保存它,并运行一个make,下面的shell命令执行(在Windows平台上,等于命令在“执行尼克斯框太):

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头生成器已运行,该窗口已moc'ed。尽管如此,窗口在可执行文件中保持不变。

更新#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它将nix我。我可以在qmake中输入什么来永久修复这个问题?

+0

实际上,MainWindow.obj应该依赖于ui_MainWindow.h而不是moc_MainWindow.cpp。 (moc_MainWindow.cpp将单独编译,并在链接步骤中链接)。一些想法:1)您的.pro文件是否有TARGET行? 2)您可能需要将“核心”和“gui”添加到QT + =行。 – piccy 2013-02-19 16:37:36

+0

@piccy:我可以确认QT包含gui核心xml xmlpatterns。 TARGET =应用程序。 – Kivin 2013-02-19 18:33:04

+0

我无法重现您在Mac上使用Qt4.8.4所看到的不需要的行为 - 如果我查看标准Qt示例,例如'examples/designer/calculatorform',即使在添加了'UI_DIR'和'INCLUDEPATH'规范之后,它也能按预期工作。这个标准例子是否适合你?如果是这样,你就可以从/朝着工作。 – 2013-02-21 17:37:31

回答

0

我相信你的UI_DIR应该被设置为ui,而不是包含在内。

+0

我在Qt文档中没有看到这方面的证据。 – Kivin 2013-03-12 01:22:18

0

有趣的是,你从配置中删除“释放”和“调试”,然后添加到配置“debug_and_release”。运行debug_and_release将在这两个配置中添加这些配置,但在CONFIG中交换它们的顺序。

这听起来不像是会触发你所看到的依赖性问题,但它是值得一试的,就我而言。

顺便说一句,你可以随时给qmake一个尝试而不会吹走你的Makefile。只要运行“qmake -o Makefile.foo”,它就会将它保存到另一个文件中。

+0

我会在一两天内尝试一下,看看会发生什么。我刚刚学会如何生活,这已经发生了一年多了。至于从配置清除发布和调试...我发现qmake文档非常好,除了关于构建模式,文档是非常糟糕的。我不记得确切的问题,但为了让qmake对某件事感到高兴,我不得不清除它们很长一段时间,尽管我当时不记得确切的问题。 – Kivin 2013-05-07 22:33:16

0

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