如何访问/修改QObject,如何在Qt5和库之间进行互操作


我创建了一个命令行程序。我现在想在它上面添加一个Qt5GUI包装器。(我对Qt5C++编程很陌生(以前这个程序只是显示命令行输出,现在我希望它在Qt5窗口上显示输出。(我已经将CLI程序的核心代码转换为库(

我的Qt5程序(一个继承QMainWindow的类(在一个新的STD线程中启动我的库。(使用STD线程正确吗?(当我的库被执行时(可能需要几个小时(,它会在回调函数中返回输出。在这些回调函数中,我想在QTextEdit实例中显示这些输出;所以我的Qt5一直崩溃(控制台总是说"分段故障(核心转储("(,因为这一定是修改QObject的错误方式。

我该怎么做?访问/修改线程函数中的QObject实例的正确方法是什么?(我想在另一个线程中运行我的库(在多线程下(,因为我不想冻结我的Qt5窗口(我需要锁定互斥吗?也许我应该使用队列结构,收集队列的任何输出,并读取队列以更新QMainWindow中的QTextEdit实例(但现在我需要一个循环函数(?我希望,一位好心的专家能给我建议。

我自己已经找到了解决方案。

  1. 必须使用QThread。我认为,STD线程永远无法访问/修改QObject实例

https://doc.qt.io/qt-5/qthread.html

重要线路:

-初始化:

WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);

-调用:

workerThread->start();
  1. 回调函数必须能够看到线程实例并调用这个"发射";作用这个";发射";函数是在.moc文件中自动定义的。(注意:标记"emit"是一个宏。(

在文档页面中

emit resultReady(result);

在我的情况下,回调函数使用线程变量调用此函数。

emit workerThread->resultReady(result);

所以每当这个";resultReady";被称为";handleResults";函数被调用。在我的情况下;handleResults";函数是在我的QMainWindow继承";myMainWindow";班

void QMainWindow::handleResults(const QString &s){
// Finally I can access/modify the QTextLine instances  XDDD
}
  1. 一个困难是,每当我调用这个";workerThread->start(("行

谢谢。XD-

最新更新