使用Qt,其中工作线程创建新的GUI元素
Using Qt where worker thread creates new GUI elements
我将保持代码简单,以便你们可以看到我正在尝试做什么;我知道所有的锁定问题,等等。我想弄清楚信号和插槽是如何与线程一起玩的。
在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()中创建的,这是否意味着插槽(例如,gott())将在主线程上运行,因此对于做GUI的东西是安全的?即使在信号是从不同的QThread引发的情况下(如本例中的MyConsole)?
是否有更好的方法允许工作线程与GUI交互(例如,Obj-C/Cocoa有一个"在主线程上发送消息"类型的方法)。Qt的方法是什么?
提前感谢!
默认情况下(Qt::AutoConnection),插槽将在创建QObject的线程中运行。因此,无论从哪个线程发出信号,槽将始终在线程中运行,QObject"生活"在其中(如果Qt事件循环在该线程中运行,否则事件无法交付)。由于主线程将成为Qt GUI线程,这将像预期的那样工作。这确实是Qt与GUI交互的方式。参见:http://doc.qt.nokia.com/4.7/thread-basics.html(查找线程亲和性)。
从一个线程发出信号并在另一个线程中接收它的"Qt方式"是使用排队连接
connect( obj, SIGNAL(foo()), other_obj, SLOT(bar()), Qt::QueuedConnection )
来自Qt文档::QueuedConnection:
当控制返回到接收者线程的事件循环时调用槽。插槽在接收者的线程中执行。
相关文章:
- 在 Gui Win32 中创建子窗口C++
- 创建小部件的GUI菜单不会出现在QT创建者中
- 在Qt中如何为用户创建GUI以输入nxn矩阵
- 无法使用 Visual Studio 2010 和 Qt 版本 4.8.0 创建"Qt Gui Application"
- 如何在非 gui 线程上正确创建 QUdpSocket?未发出现读
- 是否可以同时使用 GUI 和 3D 图形库创建应用程序
- 在QT GUI中创建一个全局对象
- 为Python逻辑创建一个C++Qt Gui
- 当主GUI线程被阻塞时,如何从工作线程创建无模式对话框
- 用于创建使用XML中定义的GUI的C 本机应用程序的库
- 使用由Eclipse中的Qt设计器创建的Qt GUI
- C++ Qt如何通过小的更改创建GUI的副本
- 在 CC++ 中使用 XML 创建 GUI
- 是否可以使用c++标准本机库创建GUI应用程序
- 我们可以将QT与C#一起使用来创建GUI吗
- QThread,在线程上创建GUI小部件元素
- 在 cpp、OpenCV 中使用"Select file"对话框创建 GUI
- 为应用程序创建gui
- 如何在c++中创建gui
- 在QT中动态创建GUI,而不使用visual Studio中的表单