Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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
C++ 如何访问/修改QObject,如何在Qt5和库之间进行互操作_C++_Qt5 - Fatal编程技术网

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

C++ 如何访问/修改QObject,如何在Qt5和库之间进行互操作,c++,qt5,C++,Qt5,我创建了一个命令行程序。现在我想在上面添加一个Qt5 GUI包装器。(我对QT5 C++编程非常新)以前程序简单地显示命令行输出,现在我想它显示QT5窗口上的输出。(我已将CLI程序的核心代码转换为库) 我的Qt5程序(继承QMainWindow的类)在新的STD线程中启动我的库。(使用STD线程正确吗?)在执行我的库时(可能需要几个小时),它会在回调函数中返回输出。在这些回调函数中,我希望在QTextEdit实例中显示这些输出;所以我的Qt5总是崩溃(控制台总是说“分段错误(内核转储)”),因

我创建了一个命令行程序。现在我想在上面添加一个Qt5 GUI包装器。(我对QT5 C++编程非常新)以前程序简单地显示命令行输出,现在我想它显示QT5窗口上的输出。(我已将CLI程序的核心代码转换为库)

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


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

我自己已经找到了解决办法

  • 必须使用QThread。我认为,STD线程永远无法访问/修改QObject实例
  • 重点是:

    -初始化:

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

    workerThread->start();
    
  • 回调函数必须能够看到线程实例并调用这个“emit”函数。此“emit”函数在.moc文件中自动定义。(注意:标记“emit”是一个宏。)
  • 在文档页面中

    emit resultReady(result);
    
    在我的例子中,回调函数使用thread变量调用这个函数

    emit workerThread->resultReady(result);
    
    因此,无论何时调用“ResulterDay”,都会调用“HandlerResults”函数。在我的例子中,“handleResults”函数是在继承“myMainWindow”类的QMainWindow中定义的

  • 一个困难是,每当调用此“workerThread->start();”行时,必须使用全局变量将参数传递到库代码中

  • 无论如何,谢谢你。XD

    在新线程中启动库意味着什么?Qt UI应该由单个线程(运行UI本身的同一线程)修改。您应该使用信号和插槽在不同线程之间进行通信。信号和插槽?AlrightMy Qt5程序启动一个新的STD线程来运行我的代码(库)。如果我在同一个线程中运行它(即,没有多线程),那么我的Qt5程序将在等待library.signals和Slot进程完成时冻结。。。那么,在运行的STD线程中仍然可以访问/修改QObject实例吗?我必须锁定互斥锁吗?
    void QMainWindow::handleResults(const QString &s){
    // Finally I can access/modify the QTextLine instances  XDDD
    }