2013-09-06 8 views
16

Ich habe mehrere Versionen von Qt installiert, und ich muss mein Projekt mit allen von ihnen kompilieren.
Mithilfe einer Profildatei konnte ich in der Dokumentation nicht finden, wie eine bedingte Kompilierung durchgeführt wird.Wie überprüft man die ausgewählte Version von Qt in einer .pro-Datei?

Idealerweise ist das, was ich tun möchte:

QT_VERSION = 5 # this can be 4, set manually 

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

Natürlich ist der if() Befehl nicht in Pro-Dateien nicht vorhanden ist.
Gibt es einen besseren Weg, das Gleiche zu tun?

+1

wäre cmake eine Option? – brunocodutra

+0

Ich benutze CMake immer wenn ich kann. Ich fürchte, das ist nicht der Fall. – Pietro

Antwort

20

Sie können bedingte Funktionen und Bereiche verwenden hier:

QT_VERSION = 5 # this can be 4, set manually 

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

Allerdings gibt es ein paar Dinge, die Sie Aufmerksamkeit in Ihrem ursprünglichen Code zahlen müssen:

  1. Explizit definieren Die Qt-Version ist nicht notwendig, und Sie können Kopfschmerzen bekommen, wenn Sie vergessen haben, das in der .pro-Datei zu ändern. Stattdessen definiert qmake automatisch eine Variable QT_MAJOR_VERSION für Sie.

  2. Die Verwendung von equals funktioniert in diesem Fall. Wie unten erwähnt, führt equals jedoch einen Zeichenfolgenvergleich durch. Es ist jedoch besser, greaterThan und lessThan zu verwenden, da Ihr Code automatisch nicht mehr funktioniert, wenn Sie versuchen, ihn mit Qt 6 (irgendwo in der Zukunft) zu kompilieren.

  3. Das Hinzufügen gui zu ist nicht erforderlich, da es standardmäßig enthalten ist.

So sollte Ihr Code sein:

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

Hier einige undocumented qmake gems sind:

  • defined(func, type) 
    

    Gibt true zurück, wenn func definiert ist; Typ muss entweder test oder replace sein, passend zu defineTest oder defineReplace.

  • equals(var1, var) 
    

    (funktioniert auch als isEqual).
    Gibt true zurück, wenn var1 gleich var2 ist (Zeichenfolgenvergleich).

  • lessThan(var1, var2)` 
    

    liefert TRUE, wenn weniger als var1var2 ist (als eine ganze Zahl).

  • greaterThan(var1, var2) 
    

    liefert TRUE, wenn var1 größer als var2 ist (als eine ganze Zahl).

  • inFile(file, var, val) 
    

    Gibt true zurück, wenn eine Variable var in der angegebenen Datei definiert ist. Darüber hinaus kann es prüfen, ob es den angeforderten Wert hat.

  • load(string) 
    

    Etwas von einer Kreuzung zwischen include() und CONFIG += [feature]. load(foo) sucht im Standardfunktionspfad nach einer Datei namens "foo.prf" und führt den Inhalt sofort aus. Funktionen, die in CONFIG enthalten sind, werden zuletzt ausgeführt, nachdem die Datei ".pro" die Verarbeitung beendet hat. Wie bei include() wird True zurückgegeben, wenn die Datei gefunden wurde.

3

Dies ist ein einfacher Test zu tun. Dies ist, was wir haben in QtSerialPort und auch einige anderen Module innerhalb der Qt-Framework zu tun:

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

ähnliche und gemeinsame Bedingungen sind:

contains(QT_MAJOR_VERSION, 5): ... 

oder:

greaterThan(QT_MAJOR_VERSION, 4): ... 

Here Sie kann ein anderes QtSerialPort-Beispiel finden, das wir dort gemacht haben.