2011-01-07 64 views
0

我有一個Qt應用程序封裝在DLL內部以插入第三方應用程序。當這些第三方應用程序啓動Qt應用程序時,第三方應用程序中的工具欄提示停止工作。只要我關閉了Qt應用程序,它們就會再次運行。在與非Qt應用程序相同的進程中加載​​Qt應用程序打破非Qt應用程序的工具提示

我在Visual Studio中創建了一個非Qt可執行文件(本例中爲具有開箱即用設置的MFC MDI應用程序)和一個Qt應用程序(我將其更改爲DLL),從而重新創建了該問題。我添加了一個菜單項非Qt的可執行文件,以及處理該事件,如下所示:

void MFCApp::OnFileLaunch() 
{ 
    QtApp qtApp; 
    qtApp.Launch(); 
} 

的QtApp類不公開的Qt API在所有,啓動()是實現如下:

int QtApp::Launch() 
{ 
    int argc = 0; 
    char *argv = 0; 
    QApplication a(argc, &argv); 
    MyMainWindow w; 
    w.show(); 
    return a.exec(); 
} 

除Qt應用程序顯示外,非Qt應用程序保持完全響應,除了工具欄工具提示(以及鍵盤快捷鍵,如Ctrl A for Select All)。

我懷疑這可能是一個Qt錯誤,但只是想檢查,以防萬一它是我的啓動代碼是錯誤的。

我正在使用Qt 4.5.2。

謝謝

回答

0

對於它的價值,我最終必須將Qt DLL放在它自己的單獨事件循環中。 Qt DLL有一個小的API,宿主應用程序可以調用它來傳輸數據,而且我只是在條目上切換線程,以便只有擁有Qt事件循環的線程才能在Qt DLL中工作。

0

不這樣做。 QApplication需要成爲過程中唯一的正確工作的事件循環。

+0

感謝您的回覆。除了單獨的流程之外,我不確定我有多少選擇?我無法更改第三方應用程序,而Qt DLL只需要一個QApplication對象。我同意這是一堆蠕蟲,但它似乎都適用於第三方應用程序中的所有其他事件。謝謝。 – Robin 2011-01-10 10:25:15

0

我認爲答案在於QAbstractEventDispatcher類,它的文檔說:

QAbstractEventDispatcher還允許與Qt的事件循環的外部事件循環的融合。例如,Motif Extension Qt解決方案包含QAbstractEventDispatcher的重新實現,它將Qt和Motif事件合併在一起。

我會看看這個。謝謝。