2013-02-15 9 views
6

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?

+0

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

+0

@piccy: Posso confermare che QT contiene xmlpatterns gui core xml. TARGET = app. – Kivin

+0

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

risposta

0

Credo che il tuo UI_DIR debba essere impostato su ui, non includere.

+0

Non vedo alcuna prova di ciò nella documentazione Qt. – Kivin

0

È interessante rimuovere dalla configurazione sia "release" che "debug", quindi aggiungere alla configurazione "debug_and_release". L'esecuzione di debug_and_release aggiunge entrambe le configurazioni in, ma scambia il loro ordine nella CONFIG.

Non sembra che ciò possa attivare il problema di dipendenza che si sta vedendo, ma vale la pena provare, per quanto mi riguarda.

A proposito, puoi sempre provare qmake senza spegnere il tuo Makefile. Basta eseguire "qmake -o Makefile.foo" e lo salverà su un altro file.

+0

Farò una prova in un giorno o due e vedrò cosa succede. Ho appena imparato a convivere con questo, dopo averlo accaduto per oltre un anno. Per quanto riguarda il clearing release e il debug di config ... Ho trovato la documentazione di qmake molto buona, tranne per quanto riguarda le modalità di compilazione, in cui la documentazione è decisamente pessima. Non ricordo il problema esatto, ma ho dovuto rimuoverli parecchio tempo fa per far sì che qmake fosse felice di qualcosa, anche se non ricordo il problema esatto in quel momento. – Kivin

0

Sono stato alle prese con problemi come questo per un po 'di tempo e ho scoperto che, DEPENDPATH ha bisogno di puntare tutte le directory con i file generati/le intestazioni di progetto. Altrimenti qmake potrebbe saltare alcune intestazioni durante la generazione delle dipendenze in Makefile. Prova ad aggiungere DEPENDPATH += include nel tuo file .pro

Problemi correlati