Il problema: Quando in Qt Designer è stato modificato un file .ui corrispondente a QMainWindow o QDialog, è necessario pulire e ricostruire l'intero progetto affinché tali modifiche abbiano effetto : make clean
quindi make
. Se il progetto non viene pulito per primo, le modifiche non rifletteranno nell'eseguibile.La modifica dei file .ui richiede un "make clean"
La Struttura Progetto:
./
project.pro
./include/
MainWindow.h
Main.h
./src/
MainWindow.cpp
Main.cpp
./ui/
MainWindow.ui
The Source:
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
Nota: Includere guardie e membri della classe sono stati spogliati per terseness.
Aggiornamento:
Supponendo che pubblichiamo mainwindow.ui in Designer, salvarlo, ed eseguire un make
, i seguenti comandi di shell vengono eseguiti (su una piattaforma Windows, pari comandi vengono eseguiti su un 'nix box troppo):
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
il generatore uic
intestazione è stato eseguito, e la finestra è stata moc'ed. Nonostante ciò, la finestra rimane invariata nell'eseguibile.
Update # 2:
Ho trovato queste righe nel 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
Bingo. MainWindow.obj
dipende correttamente da MainWindow.cpp
, ma non da moc_MainWindow.cpp
. La modifica della prima riga su build\obj\MainWindow.obj: src\MainWindow.cpp build\moc\moc_MainWindow.cpp
ha risolto l'intera questione.
Tuttavia: la prossima volta che eseguo lo qmake
mi mancherà. Cosa posso digitare in qmake per risolvere questo problema in modo permanente?
In realtà, MainWindow.obj dovrebbe dipendere da ui_MainWindow.h piuttosto che da moc_MainWindow.cpp. (moc_MainWindow.cpp verrà compilato separatamente e collegato al passaggio del collegamento.) Alcuni pensieri: 1) Il tuo file .pro ha una linea TARGET? 2) Potrebbe essere necessario aggiungere "core" e "gui" alla linea QT + =. – piccy
@piccy: Posso confermare che QT contiene xmlpatterns gui core xml. TARGET = app. – Kivin
Non riesco a riprodurre il comportamento indesiderato che si sta vedendo usando Qt4.8.4 su Mac - se osservo gli esempi standard di Qt, ad es. 'examples/designer/calculatorform', funziona come previsto, anche dopo aver aggiunto le specifiche' UI_DIR' e 'INCLUDEPATH'. Questo esempio standard funziona per te? Se è così, hai qualcosa su cui lavorare da/verso. –