我正在开发一个小型 Qt5 项目,该项目需要与一个硬件进行通信并发出多个窗口的信号。我在主函数中创建一个对象(与设备通信的线程),并使用 setContextProperty 将其“注入”到应用程序引擎。
TestClass testClass;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("testClass", &testClass);
然后,主窗口就可以访问testClass,可以调用槽函数并接收信号了。
我需要在第一个窗口之上打开一个新窗口(假设单击按钮)并开始接收相同的信号。如何从第一个窗口分离信号并将它们附加到第二个窗口?关闭第二个窗口后,我需要再次处理第一个窗口中的信号。如何实现这个场景?
实际上,您可以通过将信号实际连接到应用程序/主页来解决此问题。只需要一个连接。从该应用程序/主页,您需要管理页面并确定可见的最顶层页面并向那里发送该信号。
下面是广播消息的
Timer
的示例,但是,根据推送到 StackView
的顶部项目,只有该页面才会收到消息:
import QtQuick
import QtQuick.Controls
Page {
function sendMessage(msg) {
stackView.currentItem.receiveMessage(msg);
}
StackView {
id: stackView
anchors.fill: parent
initialItem: "FirstPage.qml"
}
Timer {
id: timer
property int mid: 0
interval: 1000
running: true
repeat: true
onTriggered: sendMessage(`message ${++mid}`)
}
}
// FirstPage.qml
import QtQuick
import QtQuick.Controls
Page {
header: Text { text: "FirstPage.qml" }
ListView {
anchors.fill: parent
model: ListModel { id: mainListModel }
delegate: Label { text: msg }
}
function receiveMessage(msg) {
mainListModel.append( {msg} );
}
footer: Frame {
Button {
text: "SecondPage"
onClicked: stackView.push("SecondPage.qml")
}
}
}
// SecondPage.qml
import QtQuick
import QtQuick.Controls
Page {
header: Text { text: "SecondPage.qml" }
ListView {
anchors.fill: parent
model: ListModel { id: secondListModel }
delegate: Label { text: msg }
}
function receiveMessage(msg) {
secondListModel.append( {msg} );
}
footer: Frame {
Button {
text: "Back"
onClicked: stackView.pop()
}
}
}
您可以在线尝试!