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

标签 c++ multithreading qt user-interface

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

在 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/

相关文章:

c++ - 如何使用 GDB 在 operator< 上设置断点

c++ - 在单个节点上,我是否应该选择 MPI 而不是其他进程间机制?

c++ - boost::asio::deadline_timer 1ms 在一段时间后滞后

java - 如何在 Java 7 中实现 "promise like"线程同步系统?

c++ - 如何从基于 QObject 的类方法返回 QList<double> 以便在 Qt 脚本中使用

python - 将插槽连接到QDialogBu​​ttonBox中的按钮

c++ - 如何比较两个C字符串指针?

c# - NServicebus - 一个端点多个处理程序线程

c# - ManualResetEvent 与 Thread.Sleep

c++ - 如何将 fromString() 与 currentDate() 一起使用