我希望从QObject连接一个信号到各个页面,由"Loader"qml元素加载.我的问题类似于死QML元素接收信号?但在调用"onDestruction"方法之前已加载项目.例如下面,如果在控制台中从page1切换到page2:
"QML: Loading status: 1 Item: QDeclarativeRectangle(0x8dcd408, "page2") QML Item: Loaded QDeclarativeRectangle(0x8dcd408, "page2") 1 qrc:/page1.qml:12: TypeError: Result of expression 'parent' [null] is not an object. qrc:/page1.qml:15: ReferenceError: Can't find variable: page1text"
每一秒.因此,不能断开与信号的连接,因为父对象被破坏了.
如何在加载的项目中处理来自QObject(root)的信号?或如何从卸载的页面断开信号?
main.qml
import QtQuick 1.1 Rectangle { id: root objectName: "root" width: 360 height: 360 state: "page1" color: "white" Item { width: parent.width height: parent.height/2 anchors.top: parent.top Loader { id: pageLoader objectName: "pageLoader" anchors.fill: parent anchors.centerIn: parent signal textMsg(variant params) onStatusChanged: console.log("QML: Loading status: ", status, " Item: ", item) onLoaded: { console.log("QML Item: Loaded",item,status); } } } states: [ State { name: "page1" PropertyChanges { target: pageLoader; source: "qrc:/page1.qml"} } ,State { name: "page2" PropertyChanges { target: pageLoader; source: "qrc:/page2.qml"} } ] Timer { // simulate signals from QObject interval: 1000; running: true; repeat: true onTriggered: pageLoader.textMsg({"msg2page1":"test","msg2page2":"test"}) } Rectangle { anchors.left: parent.left anchors.bottom: parent.bottom width: parent.width/2 height: parent.height/2 border { color: "black" width: 1 } color: "yellow" Text{ anchors.fill: parent anchors.centerIn: parent text: "Set Page 1" } MouseArea { anchors.fill: parent onClicked: { root.state = "page1"; } } } Rectangle { anchors.right: parent.right anchors.bottom: parent.bottom width: parent.width/2 height: parent.height/2 border { color: "black" width: 1 } color: "red" Text{ anchors.fill: parent anchors.centerIn: parent text: "Set Page 2" } MouseArea { anchors.fill: parent onClicked: { root.state = "page2"; } } } }
page1.qml
import QtQuick 1.1 Rectangle { id: page1 objectName: "page1" color: "yellow" Component.onCompleted: { parent.textMsg.connect(msgHandler); } Component.onDestruction: { parent.textMsg.disconnect(msgHandler); } function msgHandler(params) { page1text.text += " "+params.msg2page1; } Text { id: page1text anchors.fill: parent wrapMode: Text.WordWrap text: "page1" } }
page2.qml
import QtQuick 1.1 Rectangle { id: page2 objectName: "page2" color: "red" }
skypjack.. 7
在Loader
文档中很好地描述了这一点.它写道:
可以使用Connections元素接收从加载的项目发出的任何信号.
还有一个例子,为了清楚起见,我在下面复制它:
// Application.qml import QtQuick 1.0 Item { width: 100; height: 100 Loader { id: myLoader source: "MyItem.qml" } Connections { target: myLoader.item onMessage: console.log(msg) } } // MyItem.qml import QtQuick 1.0 Rectangle { id: myItem signal message(string msg) width: 100; height: 100 MouseArea { anchors.fill: parent onClicked: myItem.message("clicked!") } }
显然,如果item
被销毁,则忽略任何信号处理程序,直到再次重新创建目标.
在Loader
文档中很好地描述了这一点.它写道:
可以使用Connections元素接收从加载的项目发出的任何信号.
还有一个例子,为了清楚起见,我在下面复制它:
// Application.qml import QtQuick 1.0 Item { width: 100; height: 100 Loader { id: myLoader source: "MyItem.qml" } Connections { target: myLoader.item onMessage: console.log(msg) } } // MyItem.qml import QtQuick 1.0 Rectangle { id: myItem signal message(string msg) width: 100; height: 100 MouseArea { anchors.fill: parent onClicked: myItem.message("clicked!") } }
显然,如果item
被销毁,则忽略任何信号处理程序,直到再次重新创建目标.