PyQt v5.11 與早期版本不相容
PyQt v5.11 匯入sip模組
在以前的版本中,PyQt5使用通常安裝在site-packages
目錄中的sip模組的副本,並使用以下方式訪問它:
import sip
此版本包含該模組的私有副本。應用程式應按如下方式訪問它:
from PyQt5 import sip
作為向後相容性的輔助,模組仍然可以像以前一樣匯入,但這僅在PyQt5
首先匯入另一個模組時才有效。例如,以下內容將起作用:
from PyQt5 import QtCore
import sip
但是,如果import
宣告的順序顛倒,它將無法工作。
PyQt的V5.6
執行pyqtSlot簽名
在以前的版本中,如果訊號連線到由pyqtSlot修飾的方法,並且訊號和插槽的簽名不相容,則無論如何都要進行連線,就像方法沒有被裝飾一樣。這種行為是一個錯誤,而不是一個功能。
此版本可確保簽名相容,如果不是,則會引發異常。
PyQt的V5.5
Latin-1的字串轉換為QByteArray中
當預期QByteArray時,此版本將刪除Latin-1編碼字串的自動轉換。它在PyQt v5.4中被棄用了。
未處理的Python異常
在許多情況下,Python程式碼是從C ++執行的。Python重新實現C ++虛擬方法可能是最常見的例子。在以前的版本中,如果Python程式碼引發異常,那麼PyQt將呼叫Python的PyErr_Print()
函式,然後呼叫sys.excepthook。然後,預設的異常掛鉤將顯示異常和任何回溯stderr
。這種行為有許多缺點:
- 應用程式不會終止,這意味著行為與在其他情況下引發異常時的行為不同
- 編寫的輸出
stderr
可能不被開發人員或使用者看到(特別是如果它是GUI應用程式),從而隱藏了應用程式試圖報告潛在錯誤的事實。
PyQt v5.4中不推薦使用此行為。在PyQt v5.5中,未處理的Python異常將導致呼叫Qt的qFatal()
abort()
,應用程式將終止。請注意,應用程式安裝的異常掛鉤仍然優先。
PyQt的V5.3
執行Python插槽
在以前的版本中,當訊號傳送到未使用pyqtSlot修飾的Python插槽時,它不會檢查底層C ++接收器例項是否仍然存在。這與PyQt v5.0釋出時的PyQt v4行為相匹配,但不反映標準的C ++行為。
缺少檢查意味著物件可以將其已銷燬的訊號連線 到自身,以便它可以監視其底層C ++例項何時被銷燬。不幸的是,這對於更常見的程式碼來說是一個隱藏的錯誤的潛在來源。
在此版本中,已經引入了檢查 - 因此為依賴於先前行為的任何程式碼建立了不相容性。作為解決方法,no_receiver_check
已將引數新增到connect中,允許在每個連線的基礎上抑制檢查。
具有預設引數的Qt訊號
在以前的版本中,帶有預設引數的Qt訊號被暴露為多個訊號,每個訊號都有一個額外的預設參 例如 被暴露 和 其中前者是預設的訊號。因此,可以通過使用空元組作為關鍵來對後者進行索引 - 儘管這樣做沒有任何好處。QAbstractButton::clicked(bool checked = false)
QAbstractButton::clicked(bool checked)QAbstractButton::clicked()
在此版本中,僅顯示包含所有引數的訊號。但是,訊號的emit()
方法仍支援預設引數,即正常使用時,不應注意更改。