問題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分配的,分配到各個子窗口部件中的。