2017-11-02 3 views
0

Wie zeigt man eine QtQuick UI-Dateigruppe (ui.qml und .qml) aus einem normalen QML-Fenster an?Spawn QtQuick UI-Datei aus einer normalen QML-Window-Klasse

Um andere QML Fenster meiner Eltern und Window-Klasse angezeigt werden, ist der Anruf, etwa:

   var component = Qt.createComponent("SubWindow.qml") 
       var window = component.createObject(window) 
       window.show() 

Ich habe versucht, sowohl die QtQuickUISubwindow.ui.qml und QtQuickUISubwindow.qml nennen, aber weder funktioniert.

Sind QtQuickUI-Dateien nicht als Unterfenster gedacht?

+0

** 1. ** Warum erstellen Sie Windows mit JS, wenn Sie es mit QML tun könnten. ** 2. ** Nein, QtQuickUI-Dateien können nicht 'Window' oder' ApplicationWindow' als Root-Element haben. (* Versuchen Sie, das Wurzelelement einer .ui.qml-Datei manuell in 'Window' zu ändern und öffnen Sie es im Designer, um [Error M220] zu sehen (http://doc.qt.io/qtcreator/creator-checking- code-syntax.html) *). – derM

+0

Siehe auch [** hier **] (http://doc.qt.io/qtcreator/creator-quick-ui-forms.html): * "Die folgenden Funktionen werden nicht unterstützt: [...] Root-Elemente die nicht von QQuickItem oder Item abgeleitet sind [..."] * – derM

Antwort

1

Window und ApplicationWindow sind nicht vom Typ Item (oder QQuickItem). Dies ist jedoch eine Voraussetzung für die in einem .ui.qml -datei als stated in the documentation als Stammelement gelegt:

Folgende Funktionen werden nicht unterstützt:

  • [...]
  • Root-Elemente, die nicht aus QQuickItem oder Artikel abgeleitet

die Antwort ist also:

Nein, Sie können QtQuickUI-Dateien weder als Fenster noch als Unterfenster verwenden.


Sie können sie jedoch leicht

in einem Unterfenster verwenden // main.qml

Window { 
    id: root 
    width: 800 
    height: 600 
    visible: true 
    Loader { // creates my sub window without JS 
     id: winLoader 
     active: false // Change to create the window. 
     sourceComponent: Window { 
      width: srcLoader.item ? srcLoader.item.width : 0 
      height: srcLoader.item ? srcLoader.item.height : 0 
      visible: srcLoader.item 
      Loader { 
       id: srcLoader 
       source: "QtQuickUISubwindow.ui.qml" // Your ui.qml-file *here* 
       active: true 
      } 
      onClosing: winLoader.active = false 
     } 
    } 
    Button { 
     text: "Show sub window!" 
     onClicked: winLoader.active = true 
    } 
} 

Dieser Code wurde nicht von mir getestet. Vielleicht mache ich das später, wenn ich Zugang zu einer Qt-Maschine habe. Wie mehrere Fenster mit einem Repeater initialisieren und ein ListModel finden Sie hier: https://stackoverflow.com/a/47018205/2056452

Sie könnten die source des srcLoader zum Modell übergeben und von dort lesen, wenn Sie mehrere verschiedene Fenster geöffnet werden soll.


Sie können OFC die QtQuickUISubwindow.qml -Dateien ändern und einen Window oder ApplicationWindow der entsprechenden Größe als Root-Element hinzufügen. Dann können Sie alles wie gewohnt mit JS erstellen - und hoffen, dass der Garbage Collector gut spielt.

+0

Ich habe versucht, Ihr den QML-Code, war aber nicht in der Lage, es zu bekommen arbeiten, ist die Dokumentation spec wirklich die richtige Antwort und ich schätze Sie es heraus zeigen. – Austin

+0

Ich habe vergessen, das Root-Fenster sichtbar zu machen, und ich habe ein anderer Name für die 'ui.qml'-Datei Nun habe ich auch einen Button hinzugefügt, um' Loader' zu aktivieren. – derM