我会尽可能简单地编写代码,以便您们能够看到我想要做的事情;)我知道所有锁定问题等等。我正在尝试弄清楚信号和槽与线程的关系。
在main.cpp中:
假设信号和槽已经在头文件中正确设置(我已经测试过了)。现在,这里有一个问题:
在MyReceiver.cpp中:
问题是:因为MyReceiver对象是在主线程main()中创建的,这意味着槽(例如gotit())将在主线程上运行,因此可以安全地进行GUI操作吗?即使信号是从不同的QThread(例如此示例中的MyConsole)引发的?
是否有更好的方法允许工作线程与GUI交互(例如,Obj-C / Cocoa有一种“在主线程上发送消息”的方法)。那么,“Qt方式”是什么?
提前感谢!
在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())将在主线程上运行,因此可以安全地进行GUI操作吗?即使信号是从不同的QThread(例如此示例中的MyConsole)引发的?
是否有更好的方法允许工作线程与GUI交互(例如,Obj-C / Cocoa有一种“在主线程上发送消息”的方法)。那么,“Qt方式”是什么?
提前感谢!