问题:当在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中输入什么来永久修复这个问题?
实际上,MainWindow.obj应该依赖于ui_MainWindow.h而不是moc_MainWindow.cpp。 (moc_MainWindow.cpp将单独编译,并在链接步骤中链接)。一些想法:1)您的.pro文件是否有TARGET行? 2)您可能需要将“核心”和“gui”添加到QT + =行。 – piccy 2013-02-19 16:37:36
@piccy:我可以确认QT包含gui核心xml xmlpatterns。 TARGET =应用程序。 – Kivin 2013-02-19 18:33:04
我无法重现您在Mac上使用Qt4.8.4所看到的不需要的行为 - 如果我查看标准Qt示例,例如'examples/designer/calculatorform',即使在添加了'UI_DIR'和'INCLUDEPATH'规范之后,它也能按预期工作。这个标准例子是否适合你?如果是这样,你就可以从/朝着工作。 – 2013-02-21 17:37:31