2009-11-18 39 views
3

我正面臨Qt的一個實際問題。我正在使用一個與QLocalSocket進行通信的類到另一個進程(管道/ unix套接字),我需要在其他事件發生之前進行通信,即在app.exec()啓動之前(或者更準確地說,一旦應用程序啓動)。我正在使用的類需要一個事件回調,所以如果我在事件循環啓動之前調用類方法,它就不起作用。當事件循環準備就緒時,有什麼辦法可以開始?我想在隱藏的窗口構造函數中創建一個隱藏的僅用於事件的窗口並完成我的職責,並將此窗口作爲頂層實現。Qt4.5:在app.exec之前使用基於事件循環的localsocket

基本上,我需要這個本地套接字通信任務,一旦事件循環變得可用,就立即啓動。

任何想法?

謝謝。

回答

7

在調用QApplication :: exec()之前,您可以使用QEventLoop開始一個單獨的事件回調。你應該從你的類發出一個「完成」信號,並將它連接到QEventLoop quit()槽,或者使用你正在使用的Qt類中提供的現有信號。

這裏有一個簡單的例子獲取使用QNetworkAccessManager網頁:

app = QtCore.QCoreApplication([]) 
manager = QtNetwork.QNetworkAccessManager() 
req = QtNetwork.QNetworkRequest(QtCore.QUrl("http://www.google.com")) 
resp = manager.get(req) 
eventloop = QtCore.QEventLoop() 
eventloop.connect(resp, QtCore.SIGNAL('finished()'), QtCore.SLOT('quit()')) 

eventloop.exec_() # this will block until resp emits finished() 

print resp.readAll() 

app.exec_() 

雖然這可能滿足您的需求,我不明白爲什麼你不能簡單地做你擁有的任何業務呼叫展會前( )在你的窗口上,一旦完成,調用show()。

+0

我忘了提及這是一個非UI進程,它是一個監聽器進程。 – 2009-11-18 16:32:59

+0

我明白了,試試QEventLoop,它也可以與非UI應用程序一起工作。 – 2009-11-18 17:21:11

2

如果你只需要啓動通信之前的一切,你可以簡單地使用一個單次定時器0毫秒的延遲:

QTimer::singleShot(0, commsInstancePtr, SLOT(startCommunication())); 

如果你需要你的操作做別的一切之前,丹尼爾的實際完成解決方案可能更適合。

+0

您的解決方案也可能適用,因爲我可以禁用正常處理,直到我完成本地IPC。謝謝。 – 2009-11-18 23:38:03

+0

@NicolasHolthaus這就是訣竅:您仍然可以在事件循環開始之前安排一個計時器事件,它會在您啓動事件循環時觸發。 – 2015-02-11 07:28:09