我需要在非主線程中運行QApplication(我的GUI必須是可以在運行時動態加載和卸載的插件,所以我無法訪問主線程) 。有沒有人知道一種(相對)無痛的方式來解決Qt對主要啓動QApplication的限制?在非主線程中的QApplication
我正在使用gcc4.3.4在C++中用Qt4開發Linux。
我需要在非主線程中運行QApplication(我的GUI必須是可以在運行時動態加載和卸載的插件,所以我無法訪問主線程) 。有沒有人知道一種(相對)無痛的方式來解決Qt對主要啓動QApplication的限制?在非主線程中的QApplication
我正在使用gcc4.3.4在C++中用Qt4開發Linux。
如果你正在使用QThread,那麼你已經有了正常的Qt事件循環,並且可以在QThread :: run()函數內運行exec()。雖然您無法使用主線程之外的GUI對象,但您仍然可以通過排隊的信號/插槽連接與它們進行交互。也許你可以嘗試存儲指向主線程QThread對象的指針,並調用QObject :: moveToThread()將GUI對象移動到主線程,而不是將QApplication移動到另一個線程中。
我認爲嘗試用不同類型的黑客和詭計反對工具包並不是一個好主意。
補丁Qt,我想,並刪除主線程檢查,並測試是否適用於你。 根據 http://bugreports.qt-project.org/browse/QTBUG-7393 雖然不會在OS X /可可工作,因爲Cocoa假定第一個線程被派生爲主/ UI線程。
好的,我得到了一些工作!這不太好,但它確實能完成這項工作。
創建與所有在它實際GUI代碼的QMainWindow衍生物和重載這個類的事件()函數來調用這個 - >顯示()
創建一個類(姑且稱之爲Runner),它將持有一個指向你的QMainWindow衍生物的指針,並給它一個運行函數。
在亞軍::亞軍(),啓動)一個線程,它將調用亞軍:: run()的
在亞軍::運行((這是現在在它自己的線程中運行)構建一個QApplication,以及一個QMainWindow派生實例。調用QApplication的exec()函數。
現在,當你想啓動你的GUI時,只要將任何事件發佈到你的QMainWindow衍生物上,它就會顯示出來!
該解決方案似乎是在Linux下工作得很好,但它似乎真的被利用Qt中的一些漏洞,也不能在其他平臺上工作。絕對比修補Qt更容易。
Hey Boatzart,我正在努力實現同樣的目標。當你說「Runner :: Runner()」時,啓動一個將調用Runner :: run()的線程,你的意思是什麼。啓動另一個啓動亞軍螺紋的QThread?但是如何在不構建QApplication的情況下啓動另一個線程? – blueskin 2012-06-25 04:15:21
您可以在並行線程啓動的QApplication如下
#include <iostream>
#include "appthread.h"
int main(int argc, char *argv[]) {
InputArgs args = {argc, argv};
StartAppThread(args);
sleep(10);
return 0;
}
struct InputArgs{
int argc;
char **argv;
};
void StartAppThread(InputArgs &);
我認爲你可能是對的,VestniK - 雖然我的GUI確實運行,但它似乎並沒有實際服務update()調用,除非我強制操作系統通過在其上拖動另一個窗口重新繪製GUI。 – rcv 2010-05-09 22:45:47
我發現這個答案對於解決另一個問題很有用,但是當將QMainWindow對象從另一個線程移動到主線程時,我收到了'QObject :: moveToThread:Widgets無法移動到新線程' – ASten 2014-01-05 20:54:08