2016-04-14 8 views
0

Ich habe 2 qml-Dateien. Toolbarbutton.qml erstellt eine Schaltfläche und DockWidget.qml erstellt eine ListView. Ich versuche, die Schaltfläche in Toolbarbutton an DockWidget zu senden, dass auf die Schaltfläche geklickt wurde. Ich möchte dann Elemente zu meinem ListView hinzufügen.Probleme beim Empfang von 2 QML-Dateien zur Kommunikation mit Signalen

Ich habe versucht, ein Signal zu verwenden, um die Kommunikation herzustellen. In der Toolbarbutton.qml habe ich ein Rechteckelement mit einer ID von saveButton. Unter diesem Rechteck Item habe ich ein Signal namens addSaveHistory() hinzugefügt. Ich habe den Code gekürzt, damit ich besser sehen kann, was ich mache.

In der DockWidget.qml-Datei habe ich ein Element, das die Connections-Komponente verwendet. Ich habe den Code gekürzt, damit ich besser sehen kann, was ich mache.

Item{ 
    width: 100 
    height: 100 
    objectName: "Save + History" 

Rectangle { 
    id: rect 
    anchors.fill: parent 
    color: "#323232" 

Connections { 
    target: saveButton //id of rectangle in ToolbarButton.qml 

    onAddSaveHistory: { 

     // this is never called 
    } 
} 
} 

Ich kann nicht herausfinden, warum der onAddSaveHistory nie aufgerufen wird. Ich habe auch versucht, eine Loader-Komponente zu verwenden, um die Dockwidget.qml-Datei in Toolbarbutton.qml zu laden und dann speziell eine Funktion in Dockwidget aufzurufen, aber das funktioniert nicht so gut.

Habe ich nur eine falsche Vorstellung davon, wie die Signale funktionieren sollten? Ich würde jede Führung sehr schätzen.

Hier ist meine Datei main.qml.

import QtQuick 2.2 
import Painter 1.0 

import "save.js" as Save 

Plugin { 

//executed at startup 
Component.onCompleted:{ 

    //add toolbar 
    alg.ui.addToolBarWidget("ToolbarButton.qml")//add a button to toolbar 
    alg.ui.addDockWidget("DockWidget.qml")//add dock widget 

    Save.log("Incremental Save Plugin has been created") 

    } 
} 

Antwort

1

Zunächst einmal erkennen, daß das Signal auf dem QML Element an der Wurzel der ToolbarButton.qml Datei deklariert wird, das heißt das Rechteck. Nur das Root-Element bildet die Schnittstelle für das QML-Element. Alle Kindelemente sind für die Außenwelt verborgen. Daher ist es üblich, das Signal am oberen Ende der Datei zu deklarieren. Eine gemeinsame Bestellung ist:

Item { 
    id: root 
    property real foo: 0.0 
    property alias bar: innerItem.bar 
    signal baz(url location) 

    Rectangle { 
     id: innerItem 
     property color bar: "red" 
    } 
} 

Also in diesem Fall ein einfaches ToolbarButton.qml, die ein Signal deklariert und gibt es, wenn Sie in einem enthaltenen MouseArea klicken würde wie folgt aussehen:

import QtQuick 2.3 

Rectangle { 
    id: root 
    width: buttonLabel.width + 20 
    height: buttonLabel.height + 20 
    color: "steelBlue" 

    // Declare signal on the button object 
    signal addSaveHistory(string url) 

    Text { 
     id: buttonLabel 
     anchors.centerIn: parent 
     text: "Save +" 
    } 

    MouseArea { 
     id: buttonMouseArea 
     anchors.fill: parent 
     onClicked: { 
      // emit the signal 
      root.addSaveHistory("Hello?") 
     } 
    } 
} 

Dann eine einfache Verbraucher dieses Signals, hier nur ein Textelement, sondern kann so sein etwas aussehen könnte:

import QtQuick 2.3 

Text { 
    id: dockWidget 
    text: "Waiting for a click..." 
} 

aber warten Sie, sagen Sie, wie diese Hilfe tut. Bis jetzt gibt es keine Verbindung. Wir machen das, wenn wir unseren Empfängergegenstand instanziieren. Also hier sieht die main.qml-Datei wie folgt:

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    visible: true 

    // Instantiate the ToolbarButton that emits the signal when clicked 
    ToolbarButton { 
     id: toolbarButton 
     anchors.top: parent.top 
     anchors.left: parent.left 
     anchors.topMargin: 10 
     anchors.leftMargin: 10 
    } 

    // Instantiate the DockWidget (just a Text element in this example) 
    DockWidget { 
     id: dockWidget 
     anchors.bottom: parent.bottom 
     anchors.bottomMargin: 10 
     anchors.left: parent.left 
     anchors.leftMargin: 10 

     // Complete the plumbing that connects the signal from item above 
     // with id: toolbarButton. 
     Connections { 
      target: toolbarButton 
      // When signal addSaveHistory is emitted, 
      // replace binding above with a new one 
      onAddSaveHistory: dockWidget.text = "Button was clicked" 
     } 
    } 
} 

Tatsächlich gibt es keine Notwendigkeit für das Element Anschluss ein Kind des DockWidget zu sein. Stellen Sie sich das Widget "ToolbarButton" und "Dock" als Lego-Bausteine ​​vor, die wir an einem Ort zusammenführen, an dem Sie mehr über diese Elemente und deren Interaktion wissen. Wenn Sie möchten, können Sie dies in eine eigene kompliziertere benutzerdefinierte QML-Komponente einfügen.

Außerdem, wenn Sie nur eine Sache Sorge um das Signal haben, brauchen Sie nicht einmal die Anschlüsse Element überhaupt:

import QtQuick 2.3 
import QtQuick.Window 2.2 

Window { 
    visible: true 

    ToolbarButton { 
     id: toolbarButton 
     anchors.top: parent.top 
     anchors.left: parent.left 
     anchors.topMargin: 10 
     anchors.leftMargin: 10 

     // Add signal handler directly to emitter 
     onAddSaveHistory: dockWidget.text = "Button was clicked" 
    } 

    DockWidget { 
     id: dockWidget 
     anchors.bottom: parent.bottom 
     anchors.bottomMargin: 10 
     anchors.left: parent.left 
     anchors.leftMargin: 10 
    } 
} 

Hoffnung, das hilft.

+0

Hallo Sean, Vielen Dank für die Hilfe. Ich habe ein einzigartiges Problem, weil ich die qml verwende, um ein Plugin für eine andere Anwendung zu erstellen, die qml verwendet, um Schnittstellen zu erstellen. Ich kann meine main.qml nicht so einrichten, wie Sie es vorgeschlagen haben.So muss meine main.qml formatiert werden. Ich habe meinen ursprünglichen Post bearbeitet, um die main.qml anzuzeigen. – WesM

+0

Ich habe die ToolbarButton.qml so bearbeitet, dass sie so funktioniert, wie Sie es vorgeschlagen haben, sodass sie unter dem Rechteckelement platziert wird. Anschließend wird das Signal mit der Syntax id.signalFucntion() aufgerufen. Es scheint jedoch, als die Verbindung, die ich versuche, weiß nicht über das Signal in der ToolbarButton.qml – WesM

+0

Ohne zu sehen, was alg.ui.addToolBarWidget() und alg.ui.addDockWidget() ist es schwer zu sagen Was ist die Lösung? Ich vermute, dass sie die als Argumente übergebenen QML-Dateien instanziieren. Irgendwie müssen Sie in der Lage sein, auf diese Bezug zu nehmen, um ein Connections {} Element im Plugin {} Bereich verwenden zu können. Möglicherweise müssen Sie sich die Dokumente für diese Funktionen ansehen (ich kann noch nichts öffentliches für sie finden) oder fragen, ob die Entwickler, die sie geschrieben haben, ein typisches Beispiel haben. –