来自其他 QThread 的 Q_PROPERTY 将变量发送到 QML

Posted

技术标签:

【中文标题】来自其他 QThread 的 Q_PROPERTY 将变量发送到 QML【英文标题】:Q_PROPERTY from other QThread send variable to QML 【发布时间】:2014-04-02 15:00:05 【问题描述】:

当我在其他 QThread 中使用 Q_PROPERTY 时出现错误:非法尝试连接到...,它与 QML 引擎位于不同的线程中。

//myclass.cpp
Q_PROPERTY(QString FileReady READ GetFileReady NOTIFY FileReadyChanged)

这是在其他 QThread 中。 在主线程中,我有 QtQuick2ApplicationViewer 并像这样连接 Q_PROPERTY:

//main.cpp
    MyClass cObject1();

QThread cThread1;                     //create new thread
cObject1.DoSetup(cThread1);           //connect
cObject1.moveToThread(&cThread1);     //move work to other thread
viewer.rootContext()->setContextProperty("otherthread",&cObject); // propably bad line

如何将其他线程中的 myclass 中的属性发送到主线程中的 QML? 如果可以,请举一个小例子。

【问题讨论】:

【参考方案1】:

创建类“模型”,该对象将留在主线程中并将其与 QML 连接。 创建“Worker”类,它可以在其他线程中执行您想要执行的操作,并将更新从此类的对象发送到“Model”类的对象(默认连接应该可以解决问题)。 在其他方向上,“模型”应该为“工人”安排任务。

这样您就可以让线程远离 QML 引擎。

【讨论】:

以上是关于来自其他 QThread 的 Q_PROPERTY 将变量发送到 QML的主要内容,如果未能解决你的问题,请参考以下文章

来自非 Qt 线程的 QThread::getCurrentThread()

QSqlDatabase:无法使用来自 QThread 的连接

在 QThread::run 中间调用了一个插槽

QThread 与 QObject的关系(QObject可以用于多线程,可以发送信号调用存在于其他线程的slot函数,但GUI类不可重入)

Qt QThread与QObject的关系

Q_PROPERTY 未显示