1. 程式人生 > >PyQt v5.11 與早期版本不相容

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()方法仍支援預設引數,即正常使用時,不應注意更改。