簡體   English   中英

PyQt/PySide 事件循環在哪里運行?

[英]Where is the PyQt/PySide event-loop running?

如果我打開一個 Python 解釋器並輸入以下幾行:

from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()

然后出現一個文本輸入小部件。 當我與口譯員互動時,我可以與它互動。 如果我附加了任何事件處理程序,它們也會被調用。

如果我做import time; time.sleep(10) import time; time.sleep(10) ,Widget 將無響應 10 秒。

如果我運行app.exec_() ,該調用會阻塞,直到我關閉應用程序。

我的問題是:如果小部件已經在響應事件,那么運行app.exec_()有什么意義? 有什么不同嗎? 這是否只是一種防止應用程序關閉的方法,同時仍然為 Qt 的事件循環提供服務( while True: pass會導致事件循環阻塞,正如我們從time.sleep(10)理解的那樣)

我還想了解 Qt 在哪里與 CPython 掛鈎,允許解釋器和 GUI 處於活動狀態。 我知道 Python 2(可能還有 3?)有一個所謂的PyOS_InputHook機制,大約每秒調用 10 次。 IPython 使用它來運行 GUI(需要付出很多努力以每秒 10 次以上的速度處理 GUI 事件)。 當我實例化QApplication時是否發生了同樣的事情? 如果是這樣,再次調用app.exec_()

當您在交互式會話中使用 PyQt/PySide 時,事件處理在后台自動設置,允許您直接與對象交互。 例如,您可以創建並顯示一個窗口,然后在窗口仍然可見時從 python shell 中向其添加其他小部件。 但是,此行為特定於交互式會話 - 它只是為了讓您可以輕松地進行實驗,而無需自己設置事件處理。

根據 PyQt 文檔, PyOS_InputHook用於處理事件,而交互式解釋器正在等待用戶輸入(請參閱: 使用 Python Shell 中的 PyQt5 ) - 並且推測 PySide 也使用了類似的機制。

對於從腳本啟動的普通 PyQt/PySide 應用程序,您必須顯式調用app.exec_()以啟動事件處理。 否則,腳本將在所有代碼執行完畢后立即退出(即就像任何其他 python 腳本一樣)。

(要更深入地了解 Qt 的事件處理,請參閱: 線程、事件、QObjects )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM