2010-05-09 22 views
10

我需要在非主線程中運行QApplication(我的GUI必須是可以在運行時動態加載和卸載的插件,所以我無法訪問主線程) 。有沒有人知道一種(相對)無痛的方式來解決Qt對主要啓動QApplication的限制?在非主線程中的QApplication

我正在使用gcc4.3.4在C++中用Qt4開發Linux。

回答

4

如果你正在使用QThread,那麼你已經有了正常的Qt事件循環,並且可以在QThread :: run()函數內運行exec()。雖然您無法使用主線程之外的GUI對象,但您仍然可以通過排隊的信號/插槽連接與它們進行交互。也許你可以嘗試存儲指向主線程QThread對象的指針,並調用QObject :: moveToThread()將GUI對象移動到主線程,而不是將QApplication移動到另一個線程中。

我認爲嘗試用不同類型的黑客和詭計反對工具包並不是一個好主意。

+0

我認爲你可能是對的,VestniK - 雖然我的GUI確實運行,但它似乎並沒有實際服務update()調用,除非我強制操作系統通過在其上拖動另一個窗口重新繪製GUI。 – rcv 2010-05-09 22:45:47

+0

我發現這個答案對於解決另一個問題很有用,但是當將QMainWindow對象從另一個線程移動到主線程時,我收到了'QObject :: moveToThread:Widgets無法移動到新線程' – ASten 2014-01-05 20:54:08

1

好的,我得到了一些工作!這不太好,但它確實能完成這項工作。

  1. 創建與所有在它實際GUI代碼的QMainWindow衍生物和重載這個類的事件()函數來調用這個 - >顯示()

  2. 創建一個類(姑且稱之爲Runner),它將持有一個指向你的QMainWindow衍生物的指針,並給它一個運行函數。

  3. 在亞軍::亞軍(),啓動)一個線程,它將調用亞軍:: run()的

  4. 在亞軍::運行((這是現在在它自己的線程中運行)構建一個QApplication,以及一個QMainWindow派生實例。調用QApplication的exec()函數。

  5. 現在,當你想啓動你的GUI時,只要將任何事件發佈到你的QMainWindow衍生物上,它就會顯示出來!

該解決方案似乎是在Linux下工作得很好,但它似乎真的被利用Qt中的一些漏洞,也不能在其他平臺上工作。絕對比修補Qt更容易。

+0

Hey Boatzart,我正在努力實現同樣的目標。當你說「Runner :: Runner()」時,啓動一個將調用Runner :: run()的線程,你的意思是什麼。啓動另一個啓動亞軍螺紋的QThread?但是如何在不構建QApplication的情況下啓動另一個線程? – blueskin 2012-06-25 04:15:21

8

您可以在並行線程啓動的QApplication如下

//main.cpp

#include <iostream> 
#include "appthread.h" 
int main(int argc, char *argv[]) { 
    InputArgs args = {argc, argv}; 
    StartAppThread(args); 
    sleep(10); 
    return 0; 
} 

//appthread.h

struct InputArgs{ 
    int argc; 
    char **argv; 
}; 
void StartAppThread(InputArgs &); 

//appthread.cpp

​​
相關問題