具有多个线程的 QML C++ 属性绑定
qml c++ property bindings with multiple threads
我正在创建一个模块化应用程序。它有一个Core
,和几个模块,其中一个是gui模块。这些模块可以通过命令行启动:
myApp gui=qml=qmlFile.qml connection=serial=/dev/ttyS1
将使用一个(也可以多个(GUI和一个串行连接启动应用程序。始终有一个Router
对象来处理连接。Guis 由如下所示的类加载:
class Gui :QObject{
Core* core;
public:
QQmlApplicationEngine engine;
public slots:
void start(){
engine.load("qrc:/gui/from/command/line.qml");
}
在 gui 中,我有一个名为 ConnectionController{}
的 qml,这是一种添加/删除连接的简单方法。但这只是同类产品中的第一次:最终每个模块都应该有一个 qml 组件来控制它。
这一切都工作正常,但现在我正在尝试添加多个线程。我想有一个RouterThread
和一个GuiThread
.这本身只是将Router
(由Core
(的创建更改为以下问题:
m_router = new Router(this /*not as parent, just as pointer*/);
m_router->moveToThread(&routerThread);
(GUI目前仍存在于主线程中(在此之后,除了 qml 属性绑定之外,一切仍然正常工作。
QQmlEngine: Illegal attempt to connect to SerialConnection(0x7f58d00013a0) that is in a different thread than the QML engine
因为Gui
和孩子QQmlEngine engine
住在guiThread
,而SerialConnection
住在routerThread
。Router
和Gui
之间的信号和插槽(没有qml(确实有效,因为它们默认由qt作为异步处理(只要定义了适当的类型(。
嗯,不,你不能从你的 gui 访问线程对象,也不应该尝试。
您需要构建一个位于向 qml 公开的主线程中的 c++ 模型。在此模型中,您可以通过队列连接连接到线程发出的信号,并将它们链接到模型自己的信号。此外,您应该确保当您从另一个线程拥有的对象读取数据时,所有内容都正确互斥,否则您将读取垃圾。
相关文章:
- 从C++实例化QML
- 使用CMake创建QML插件
- QT通过C++添加映射QML项目
- 如何在没有信号的情况下从C++执行QML插槽
- QML按钮点击功能执行顺序
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 建议在运行时将带有类实例的列表从c++导入qml
- Qt Quick-如何仅从c++代码与qml属性交互
- 如何将带有自定义对象的容器从C++传递到QML
- QML 使用带有参数C++函数
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- 如何从C++端挂接到 QML 项的 onClick 事件
- 在 qml 中使用 Q_ENUM 和 Q_PROPERTY 作为枚举类
- 从C++更改 QML 图像源
- QML TableView 使用 QtQuick.Controls 2 单击行
- 如何多次询问来自QML对话框的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 阅读 QML 中结构C++ QVector 的 QVector
- 如何使用connect将qml按钮与同一类的cpp函数连接起来
- Qt QML桌面应用程序自动化测试