2013-09-06 29 views
16

Mam wiele wersji Qt zainstalowanych i muszę skompilować mój projekt z nimi wszystkimi.
Korzystając z pliku pro, nie mogłem znaleźć w dokumentacji, w jaki sposób wykonać kompilację warunkową.Jak sprawdzić wybraną wersję Qt w pliku .pro?

Idealnie, to jest to, co chciałbym zrobić:

QT_VERSION = 5 # this can be 4, set manually 

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

Naturalnie, polecenie if() nie istnieje w plikach Pro.
Czy jest lepszy sposób na zrobienie tego samego?

+1

będzie cmake być opcją? – brunocodutra

+0

Zawsze używam cmake, kiedy mogę. Obawiam się, że tak nie jest. – Pietro

Odpowiedz

20

można wykorzystywać funkcje warunkowe i zakresów tutaj:

QT_VERSION = 5 # this can be 4, set manually 

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

Jednakże, istnieje kilka rzeczy, które trzeba zwrócić uwagę w swoim oryginalnym kodzie:

  1. wyraźne zdefiniowanie wersja Qt nie jest konieczna i może spowodować ból głowy, jeśli zapomnisz zmienić to w pliku .pro. Zamiast tego, qmake automatycznie definiuje dla ciebie zmienną QT_MAJOR_VERSION.

  2. Używanie equals będzie działać w tym przypadku. Jednak, jak wspomniano poniżej, equals dokonuje porównania łańcuchów. Jednak lepiej jest używać greaterThan i lessThan, ponieważ twój kod automatycznie przestanie działać, gdy spróbujesz skompilować go z Qt 6 (gdzieś w przyszłości).

  3. Dodanie gui do QT nie jest konieczne, ponieważ jest dołączone domyślnie.

więc kod powinien być:

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

Oto niektóre undocumented qmake gems:

  • defined(func, type) 
    

    Zwraca true jeśli func jest określona; typ musi być test lub replace, aby dopasować defineTest lub defineReplace.

  • equals(var1, var) 
    

    (działa również jako isEqual).
    Zwraca wartość true, jeśli zmienna 1 jest równa war2 (porównanie ciągów).

  • lessThan(var1, var2)` 
    

    Zwraca true var1 jest mniejsza niż var2 (jako liczba całkowita).

  • greaterThan(var1, var2) 
    

    Zwraca true var1 jest większa niż var2 (jako liczba całkowita).

  • inFile(file, var, val) 
    

    Zwraca true jeśli zmienna var jest zdefiniowana w określonym pliku. Dodatkowo może przetestować, czy ma żądaną wartość.

  • load(string) 
    

    Coś skrzyżowanie include() i CONFIG += [feature]. load(foo) będzie szukał pliku o nazwie "foo.prf" w standardowej ścieżce funkcji i natychmiast wykona jego zawartość. Funkcje zawarte w CONFIG są wykonywane na końcu, po zakończeniu przetwarzania pliku ".pro". Podobnie jak include(), zwróci true, jeśli plik zostanie znaleziony.

3

Jest to prosty test do wykonania. To, co robiliśmy w QtSerialPort, a także kilka innych modułów wewnątrz ram Qt:

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

podobne i wspólne warunki:

contains(QT_MAJOR_VERSION, 5): ... 

czyli

greaterThan(QT_MAJOR_VERSION, 4): ... 

Here ci można znaleźć inny przykład QtSerialPort, który tam robiliśmy.