Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Qt/QML前端与C+之间的直接交互+;另一个线程中的后端/模型 我有一个Qt/QML(Qt5.7.1)应用程序,它需要与一个(相当复杂的)C++后台进行交互,它在另一个线程中。p> 目前,我遵循博客文章的建议,创建了一个C++类的“主控制器”,它是通过注册的。 qmlRegisterType<MainController>("MainController", 1, 0, "MainController");_Multithreading_Qt_Qml_Backend - Fatal编程技术网

Multithreading Qt/QML前端与C+之间的直接交互+;另一个线程中的后端/模型 我有一个Qt/QML(Qt5.7.1)应用程序,它需要与一个(相当复杂的)C++后台进行交互,它在另一个线程中。p> 目前,我遵循博客文章的建议,创建了一个C++类的“主控制器”,它是通过注册的。 qmlRegisterType<MainController>("MainController", 1, 0, "MainController");

Multithreading Qt/QML前端与C+之间的直接交互+;另一个线程中的后端/模型 我有一个Qt/QML(Qt5.7.1)应用程序,它需要与一个(相当复杂的)C++后台进行交互,它在另一个线程中。p> 目前,我遵循博客文章的建议,创建了一个C++类的“主控制器”,它是通过注册的。 qmlRegisterType<MainController>("MainController", 1, 0, "MainController");,multithreading,qt,qml,backend,Multithreading,Qt,Qml,Backend,在其构造函数中,MainController(与QML代码在同一线程中运行)创建一个Worker对象,然后将其移动到自己的线程中: MainController::MainController() : QObject() { state = GUI_State::HW_STANDBY; QThread* thread = new QThread; Worker* worker = new Worker(); worker->moveToThread(thr

在其构造函数中,MainController(与QML代码在同一线程中运行)创建一个Worker对象,然后将其移动到自己的线程中:

MainController::MainController() : QObject()
{
    state = GUI_State::HW_STANDBY;

    QThread* thread = new QThread;
    Worker* worker = new Worker();
    worker->moveToThread(thread);
    connect(worker, SIGNAL (error(QString)), this, SLOT (errorString(QString)));
    connect(thread, SIGNAL (started()), worker, SLOT (process()));
    connect(worker, SIGNAL (finished()), thread, SLOT (quit()));
    connect(worker, SIGNAL (finished()), worker, SLOT (deleteLater()));
    connect(thread, SIGNAL (finished()), thread, SLOT (deleteLater()));
    ...
    thread->start();
    qDebug() << "Thread started";
}
MainController::MainController():QObject()
{
状态=GUI_状态::HW_备用;
QThread*thread=新的QThread;
工人*工人=新工人();
辅助线程->移动到线程(线程);
连接(worker,SIGNAL(error(QString)),此,插槽(errorString(QString));
连接(线程、信号(已启动())、工作线程、插槽(进程());
连接(工作、信号(完成())、线程、插槽(退出());
连接(worker、信号(finished())、worker、插槽(deleteLater());
连接(线程、信号(finished())、线程、插槽(deleteLater());
...
线程->开始();
qDebug()主控制器->工作程序

QML如果您不使用
Q_属性
,您可以在QML中实例化worker本身,也可以通过

Worker* workerObj = new Worker();   
engine->rootContext()->setContextProperty("qmlWorker", workerObj );
这仅适用于信号/插槽连接,以及
Q\u可调用的


如果您想通过不同的线程使用QML属性,我建议使用您的方法,因为这通常是处理Qt中线程的一种保存方式。

根据,您无法访问位于另一个线程中的属性。

公开工作线程(指向对象的指针)作为属性。QThread继承QObject。您可以直接将一个信号连接到另一个信号。这很好,只要您只使用qml中的信号和插槽,而不使用属性。保持线程方式,并将第二个代码行添加到设置代码中。您可以使用
qmlWorker
我需要如何引用qmlWor从qml访问工作程序我尝试了上面的setContextProperty,但是当我在qml中使用例如“text:qmlWorker.number2”时,我得到了运行时错误“QQmlEngine:非法尝试连接到与qml引擎QQmlApplicationEngine(0x55f1da08b6c0)不同的线程中的工作者(0x55f1d9f19630)”编辑了原始答案。这不是一个答案,而是一条评论。它不应该作为答案发布。@talamaki:你到底是什么意思?我最初的问题是,如何将QML直接链接到工作线程。在链接的讨论中,结果是,如果属性位于另一个线程中,则无法访问属性。对我来说,这回答了我的问题.所以我把它贴在这里供其他人评论。
QML -> MainController -> Worker
QML <- MainController <- Worker
Worker* workerObj = new Worker();   
engine->rootContext()->setContextProperty("qmlWorker", workerObj );