修改.ui文件需要`make clean`

时间:2013-02-15 01:22:12

标签: c++ qt

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

项目结构

make

来源

MainWindow.h:

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

MainWindow.cpp:

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

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

    MainWindow();
};

project.pro:

#include "MainWindow.h"

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

注意:包括警卫和班级成员因为简洁而被剥夺。

更新

假设我们在Designer中编辑MainWindow.ui,保存它并运行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 ,则执行以下shell命令(在Windows平台上;同样的命令也在'nix框上执行):< / p>

make

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

更新#2

我在Makefile中找到了这些行:

uic

宾果。 ####### 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中键入什么来永久修复此问题?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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