gpt4 book ai didi

QT + 如何从在不同线程中运行的自定义 C++ 代码调用插槽

转载 作者:行者123 更新时间:2023-12-03 22:59:05 24 4
gpt4 key购买 nike

我是 QT 的新手,我正在学习。

我想触发一个从 C++ 线程(当前是 Qthread)修改 GUI 小部件的插槽。

不幸的是,我得到一个:断言失败:Q_ASSERT(qApp && qApp->thread() == QThread::currentThread());

这是一些代码:

(MAIN + Thread 类)

   class mythread : public QThread
{
public:
mythread(mywindow* win){this->w = win;};
mywindow* w;
void run()
{
w->ui.textEdit->append("Hello"); //<--ASSERT FAIL
//I have also try to call a slots within mywindow which also fail.
};
};

int main(int argc, char *argv[])
{
QApplication* a = new QApplication(argc, argv);
mywindow* w = new mywindow();

w->show();
mythread* thr = new mythread(w);
thr->start();

return a->exec();
}

window :
class mywindow : public QMainWindow
{
Q_OBJECT

public:
mywindow (QWidget *parent = 0, Qt::WFlags flags = 0);
~mywindow ();
Ui::mywindow ui;

private:



public slots:
void newLog(QString &log);
};

所以我很好奇如何通过不同线程中的代码更新 gui 部分。

感谢您的帮助

最佳答案

stribika 几乎是正确的:

QMetaObject::invokeMethod( textEdit, "append", Qt::QueuedConnection,
Q_ARG( QString, myString ) );

不过 cjhuit 是对的:您通常希望在线程上声明一个信号并将其连接到 append()插槽,免费获得对象生命周期管理(嗯,以较小的接口(interface)更改为代价)。在旁注中,附加论点:
               Qt::QueuedConnection ); // <-- This option is important!

不再需要来自 cjhuit 的回答(在 Qt <= 4.1 中是这样),因为 connect()默认为 Qt::AutoConnection现在 (Qt >= 4.2) 做了正确的事情并基于 QThread::currentThread() 在排队和直接连接模式之间切换和接收者的线程亲和性 QObject在发射时(而不是连接时的发送者和接收者亲和性)。

关于QT + 如何从在不同线程中运行的自定义 C++ 代码调用插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com