2013-09-06 30 views
16

ho più versioni di Qt installati, e ho bisogno di compilare il mio progetto con tutti loro.
utilizzo di un file pro, non riuscivo a trovare nella documentazione di come fare una compilazione condizionale.Come verificare la versione selezionata di Qt in un file .pro?

Idealmente, questo è quello che vorrei fare:

QT_VERSION = 5 # this can be 4, set manually 

if(QT_VERSION == 5) { 
    QT += widgets 
} 
if(QT_VERSION == 4) { 
    QT += gui 
} 

Naturalmente, il comando if() non esiste nei file pro.
C'è un modo migliore per fare la stessa cosa?

+1

sarebbe un'opzione? – brunocodutra

+0

Io uso sempre cmake quando posso. Temo che non sia così. – Pietro

risposta

20

È possibile utilizzare funzioni condizionali e gli ambiti qui:

QT_VERSION = 5 # this can be 4, set manually 

equals(QT_VERSION, 5){ 
    QT += widgets 
} 
equals(QT_VERSION, 4) { 
    QT += gui 
} 

Tuttavia, ci sono alcune cose che è necessario prestare attenzione al tuo codice originale:

  1. esplicitamente che definiscono la versione Qt non è necessaria e può farti venire il mal di testa se ti dimentichi di cambiarlo nel file .pro. Invece, qmake definisce automaticamente una variabile QT_MAJOR_VERSION per te.

  2. Utilizzando equals funziona in questo caso. Tuttavia, come indicato di seguito, equals esegue un confronto tra stringhe. Tuttavia, è meglio utilizzare greaterThan e lessThan perché il codice si interromperà automaticamente di funzionare quando si tenta di compilare con Qt 6 (da qualche parte in futuro).

  3. L'aggiunta di gui a QT non è necessaria, poiché è inclusa per impostazione predefinita.

Così, il vostro codice dovrebbe essere:

greaterThan(QT_MAJOR_VERSION, 4) { 
    QT += widgets 
} 

Ecco alcuni undocumented qmake gems:

  • defined(func, type) 
    

    Restituisce vero se func è definito; tipo deve essere o test o replace, per abbinare defineTest o defineReplace.

  • equals(var1, var) 
    

    (funziona anche come isEqual).
    Restituisce vero se var1 var2 è uguale a (confronto tra stringhe).

  • lessThan(var1, var2)` 
    

    Restituisce vero se var1 è inferiore var2 (come un numero intero).

  • greaterThan(var1, var2) 
    

    Restituisce vero se var1 è maggiore var2 (come un intero).

  • inFile(file, var, val) 
    

    Restituisce vero se una variabile var è definita nel file specificato. Inoltre, può verificare se ha il valore richiesto.

  • load(string) 
    

    Qualcosa di un incrocio tra include() e CONFIG += [feature]. load(foo) cercherà un file chiamato "foo.prf" nel percorso di funzionalità standard ed eseguirà immediatamente il suo contenuto. Le funzioni contenute in CONFIG vengono eseguite per ultime, dopo che il file ".pro" ha terminato l'elaborazione. Come include(), restituirà true se il file è stato trovato.

3

Questo è un test semplice da fare. Questo è ciò che abbiamo fatto in QtSerialPort e anche alcuni altri moduli all'interno del framework Qt:

lessThan(QT_MAJOR_VERSION, 5) { 
... 
} else { 
... 
} 

condizioni simili e comuni sono:

contains(QT_MAJOR_VERSION, 5): ... 

o:

greaterThan(QT_MAJOR_VERSION, 4): ... 

Here voi possiamo trovare un altro esempio di QtSerialPort che abbiamo fatto lì.