2016-06-07 10 views
2

Ich habe einige Work-in-Progress-QML-Code, der derzeit QtCharts 2.1 von Qt 5.6 erfordert. Allerdings führen wir unseren Code derzeit mit Qt 5.5.1 aus, das nur QtCharts 2.0 enthält.QML-Import spätere Modulversion nur wenn verfügbar?

Ist es möglich, in QML einzuchecken, was die neueste verfügbare Version von QtCharts auf dem System ist, dann führen Sie den richtigen Import, und behandeln Sie alle zugehörigen Sonderfall Logik geeignet? Ich möchte die Implementierung meiner Funktion abschließen und sie in den Integrationszweig ohne einbinden, um die GUI-Funktionalität auf Computern mit 5.5.1 zu brechen. (Ich bin okay mit diese neuen Funktion jetzt gebrochen werden, aber zur Zeit scheint es, dass der gesamte QML-Engine nicht geladen werden kann, wenn eine QML-Datei ungültig Importe enthält.)

Aus purer unbeugsamer Hoffnung habe ich versucht, die folgende:

try { 
    import QtCharts 2.1 
} catch { 
    import QtCharts 2.0 
} 

... was natürlich nicht funktioniert, wie try ist nicht Teil der QML Stammebene Syntax.


Eine verwandte-but-not-quite-Duplikat Frage ist here. Der Unterschied besteht darin, dass das OP für diese Frage anscheinend mit der Verwendung eines Loader zum dynamischen Laden eines einzelnen QML-Elements zufrieden ist. Ich glaube nicht, dass dieser Trick in meinem Fall verwendet werden kann, weil QtCharts 2.0 und 2.1 die gleichen QML - Elementtypen enthalten, und auf jeden Fall weiß ich nicht, wie man "die neuesten" verfügbaren QtCharts importiert (soweit Ich kann sagen, die import Anweisung Syntax erfordert eine bestimmte Versionsnummer).

EDIT: Wie pro meine Antwort unten, die Loader Abhilfe nicht anscheinend arbeiten. Ich nehme an, das ist immerhin ein Duplikat.

Antwort

1

Bedingte Importe wurden als Feature für Qt 4.7 angefordert, wurden aber noch nicht implementiert; Details finden Sie unter bug report.

Es ist jedoch möglich, einen Loader zu verwenden, um sicherzustellen, dass der Fehler import den Rest der GUI nicht zum Laden hindert. Dies wird in einem der Kommentare in der Bug-Report-Diskussion beschrieben.

FAILING CASE:

// MyContainer.qml 
Item { 
    AlwaysAvailableType { 
     // ... etc 
    } 
    SometimesNonworkingType { 
     id: nonworking_thing 
     // ... FAILS to load! 
    } 
} 

Hier gehen wir davon aus, dass SometimesNonworkingType.qml enthält die import Anweisung, die auf einigen Systemen, andere aber nicht scheitern. Wenn die QML-Engine versucht, MyContainer zu laden, wird es fehlschlagen, was die gesamte QML-Ladeoperation zum Fehlschlagen verursacht.

FIXED VERSION:

// MyContainer.qml 
Item { 
    AlwaysAvailableType { 
     // ... etc 
    } 
    Loader { 
     source: "SometimesNonworkingType.qml" 
     property bool valid: item !== null 

     id: maybeworking_thing 
     // ... etc 
    } 
} 

maybeworking_thing.valid kann überprüft werden, wenn die SometimesNonworkingType geladen tatsächlich erfolgreich war.

(Credit für den Fehlerbericht zu finden: How to write conditional import statements in QML?)

+0

24. Januar 2011 .... – coyotte508

+0

@ coyotte508 Ja, es sieht so aus, dass wahrscheinlich nie realisiert werden. –

+0

@ coyotte508 Allerdings habe ich mir den vorgeschlagenen Work-around noch einmal angeschaut, und er funktioniert * in meinem Fall. –