2016-04-14 55 views
0

2 qml dosyam var. Toolbarbutton.qml bir düğme oluşturur ve DockWidget.qml bir ListView oluşturur. Toolbarbutton'da, düğmenin tıklandığından DockWidget'e yayın yapmaya çalışıyorum. Sonra listeme öğe eklemek istiyorum.Sorun Giderme 2 QML dosyalarını Sinyalleri kullanarak iletişim kurmak için alma

İletişimi kurmak için bir sinyal kullanmaya çalışıyorum. Toolbarbutton.qml dosyasında, bir saveButton kimliğine sahip bir Dikdörtgen öğem var. Bu Dikdörtgen Öğe altında addSaveHistory() adında bir sinyal ekledim. Kodu kısaltdım, böylece ne yaptığımı görmek daha kolay.

Rectangle { 
id: saveButton 
width: 50 
height: 30 
border.color: "white" 
color: buttonMouseArea.containsMouse ? "grey" : "black" 

//Button text 
Text{ 
    id: buttonLabel 
    anchors.centerIn: parent 
    text: "Save +" 
    color: "white" 
} 
signal addSaveHistory(string url) 

MouseArea{ 
    id: buttonMouseArea 
    anchors.fill: parent //anchor the mousearea to the rect area 

    //onClicked handles valid mouse button clicks 
    onClicked: { 
     addSaveHistory("Hello?") //dispatch the event 

    } 
} 
} 

DockWidget.qml dosyasında Connections bileşenini kullanan bir Öğem var. Kodu kısalttım, böylece ne yaptığımı görmek daha kolay.

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 
    } 
} 
} 

Ben onAddSaveHistory asla denir neden anlamaya gibi olamaz. Ayrıca Dockwidget.qml dosyasını Toolbarbutton.qml dosyasına yüklemek için bir Loader bileşenini kullanmayı denedim ve sonra da özellikle Dockwidget'de bir işlevi çağırmayı denedim, ancak bu da işe yaramıyor.

Sinyallerin nasıl çalışması gerektiğine dair yanlış bir fikrim var mı? Ben herhangi bir rehberlik takdir ediyorum.

İşte benim main.qml dosyası. Her şeyden

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") 

    } 
} 

cevap

1

Birincisi, sinyal yani Dikdörtgen ToolbarButton.qml dosyasının kökü, en QML elemanı ile bildirme biliyoruz. Sadece kök öğe, QML öğesi için arabirimi oluşturur. Tüm çocuk unsurları dış dünyaya gizlenmiştir. Yani, dosyanın tepesine yakın sinyali bildirmek gelenekseldir. Yaygın bir sıralamadır:

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

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

bir sinyal beyan ve bu gibi görünecektir bir içerdiği MouseArea içinde tıklandığında yayar basit ToolbarButton.qml: Sonra

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?") 
     } 
    } 
} 

basit

import QtQuick 2.3 

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

ama bu yardım nasıl yaptığını söylemek, bekle: burada sadece Metin öğesi ancak bu sinyalin tüketici şey gibi görünebilir olabilir. Şimdiye kadar bağlantı yok. Alıştığımız eşyayı hazırladığımızda bunu yapıyoruz. Yani burada, main.qml dosyası şuna benzer:

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" 
     } 
    } 
} 

Aslında DockWidget bir çocuk olmak Bağlantılar elemana ihtiyaç yoktur. ToolbarButton ve Dock widget'ını, bu öğeler hakkında daha fazla bilgiye sahip olan ve nasıl etkileşime girecekleri bir yerde bir araya getirdiğimiz lego tuğlaları olarak düşünün. Yine de isterseniz, bunu kendi daha karmaşık özel QML bileşenine sarabilirsiniz. Bu yardımcı olur

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 
    } 
} 

Hope: Sadece sinyal hakkında bir şey bakımını varsa

Dahası, hatta hiç Bağlantıları elemanı gerekmez.

+0

Merhaba Sean, Yardımlarınız için çok teşekkürler. Benzersiz bir sorunum var çünkü arayüz oluşturmak için qml kullanan başka bir uygulama için bir eklenti oluşturmak için qml kullanıyorum. Ana.qml'imi önerdiğiniz gibi ayarlayamıyorum.Bu benim main.qml'nin nasıl biçimlendirilmesi gerektiğidir. Main.qml dosyasını göstermek için orijinal gönderimi düzenledim. – WesM

+0

ToolbarButton.qml dosyasını, dikdörtgen öğenin altına yerleştirilmesi için önerdiğiniz şekilde çalıştım ve daha sonra sinyal, id.signalFucntion() sözdizimi kullanılarak çağrıldı. Ancak, kurmaya çalıştığım bağlantı, ToolbarButton.qml – WesM

+0

'daki sinyali bilmediğinden, alg.ui.addToolBarWidget() ve alg.ui.addDockWidget() öğelerinin ne olduğunu görmeden çözüm ne. Ben argüman olarak aktarılan QML dosyalarını başlattıklarını tahmin ediyorum. Bir şekilde, Eklenti {} kapsamındaki bir Connections {} öğesini kullanabilmek için bunlara başvurabilmeniz gerekir. Bu işlevler için doktora göz atmanız gerekebilir (henüz onlar için herkese açık bir şey bulamıyorum) ya da bunları yazan devlerin tipik bir örneği olup olmadığını sorun. –