问题2:窗口操作只能运行于主线程(可能原因为窗口需要QApplication的支持,而QApplication是定义在主线程中的,窗口运行在主事件循环中,而次线程的exec只是属于它的次线程循环)。当在次线程中QMessageBox();错误如下: ASSERT failure in QWidget: "Widgets must be created in the GUI thread.", file kernel/qwidget.cpp, line 1069 QObject::killTimers: timers cannot be stopped from another thread。我想要在此线程做了某个操作后就弹出个对话框进行提示,那该怎么办。、
答案:既然主线程负责窗口操作,那么我们就把这个事交给主线程来做。我是在次线程中emit一个信号,而这个信号连接的槽运行在主线程中,所以让这个槽来QMessageBox;这也说明了,如果一个功能在一个地方运行不了,那么我们可以通过信号槽机制使得它在别的地方运行,不能运行的地方抛信号,能运行的地方定义槽,信号和槽进行合适的连接,一般在构照函数中(对象的开始函数哦)。在help文档中有一句The main event loop receives events from the window system and dispatches these to the application widgets. Generally speaking, no user interaction can take place before calling exec(). 也就是说一切的窗口操作事件都是由a.exec分配的,分配到各个子窗口部件中的。