Qt5,QML,如何将一些信号从后台线程传递到多个窗口

问题描述 投票:0回答:1

我正在开发一个小型 Qt5 项目,该项目需要与一个硬件进行通信并发出多个窗口的信号。我在主函数中创建一个对象(与设备通信的线程),并使用 setContextProperty 将其“注入”到应用程序引擎。

TestClass testClass;
    
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("testClass", &testClass);

然后,主窗口就可以访问testClass,可以调用槽函数并接收信号了。

我需要在第一个窗口之上打开一个新窗口(假设单击按钮)并开始接收相同的信号。如何从第一个窗口分离信号并将它们附加到第二个窗口?关闭第二个窗口后,我需要再次处理第一个窗口中的信号。如何实现这个场景?

multithreading qml qt5
1个回答
0
投票

实际上,您可以通过将信号实际连接到应用程序/主页来解决此问题。只需要一个连接。从该应用程序/主页,您需要管理页面并确定可见的最顶层页面并向那里发送该信号。

下面是广播消息的

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

您可以在线尝试!

© www.soinside.com 2019 - 2024. All rights reserved.