gpt4 book ai didi

c++ - 在工作线程创建新 GUI 元素的地方使用 Qt

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:52 24 4
gpt4 key购买 nike

我会保持代码简单,以便你们可以看到我正在尝试做的事情;)我知道所有锁定问题等。我正在尝试弄清楚信号和槽如何与线程一起玩。

在 main.cpp 中:

int main(int argc, char *argv[]) {
QApplication app(argc, argv);
MyConsole c; // Subclasses QThread and implements run()
MyReceiver r(app); // We pass app to MyReceiver for later (see below)
QObject::connect(&c, SIGNAL(sendit()),
&r, SLOT(gotit()));
c.start(); // Start the worker thread
app.exec();
}

假设在头文件中正确设置了信号和槽(我已经测试过了,确实如此)。现在,问题来了:

在 MyReceiver.cpp 中:

void MyReceiver::gotit()
{
QLabel *label = new QLabel(0, "Hello"); // Some GUI element, any will do
app.setMainWidget(*label); // Some GUI action, any will do
}

问题是:因为 MyReceiver 对象是在主线程上的 main() 中创建的,这是否意味着插槽(例如 gotit())将在主线程上运行,因此可以安全地执行图形用户界面的东西?即使信号是从不同的 QThread 发出的(如本例中的 MyConsole)?

是否有更好的方法允许工作线程与 GUI 交互(例如,Obj-C/Cocoa 有一种“在主线程上发送消息”类型的方法)。这样做的“Qt 方式”是什么?

提前致谢!

最佳答案

默认情况下(Qt::AutoConnection),插槽将在创建 QObject 的线程中运行。因此,无论您从哪个线程发出信号,插槽都将始终在线程中运行,QObject“存在” "in(如果 Qt 事件循环正在该线程中运行,否则事件无法传递)。由于主线程将成为 Qt GUI 线程,这将按预期工作。这确实是 Qt 与 GUI 交互的方式。另请参阅:http://doc.qt.nokia.com/4.7/thread-basics.html (寻找线程亲和性)。

关于c++ - 在工作线程创建新 GUI 元素的地方使用 Qt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210905/

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