PyQt4和PyQt5之間的差異
PyQt4和PyQt5之間的差異
PyQt5與PyQt4不相容(儘管經驗表明將應用程式從PyQt4移植到PyQt5的工作量並不大)。本節介紹兩者之間的主要區別。
支援的Python版本
不支援早於v2.6的Python版本。
不推薦使用的功能
PyQt5不支援在Qt v5.0中標記為已棄用或已過時的Qt API的任何部分。然而,其中一些可能是偶然包括在內的。這些被視為錯誤,如果找到則將被刪除。
多個
PyQt4中支援多種不同的API的版本(QString
QPyNullVariant
中描述了對QVariant的更改支援 ,包括刪除 。
舊式訊號和插槽
不支援PyQt4的舊式訊號和插槽。因此,PyQt5中未實現以下內容:
QObject.connect()
QObject.emit()
SIGNAL()
SLOT()
所有具有引數的方法通常是呼叫 SIGNAL()
或SLOT()
不再受支援的結果。將始終存在分別採用繫結訊號或可呼叫的等效項。
此外,以下方法有所不同:
disconnect()
不接受任何引數並斷開與QObject例項的所有連線。
新式訊號和插槽
Qt將帶有可選引數的訊號實現為兩個獨立的訊號,一個帶有引數,一個帶有引數。PyQt4暴露了這兩個允許你連線到它們中的每一個。但是,在發出訊號時,必須使用適合於發出的引數數量的訊號。
PyQt5僅公開指定所有引數的訊號。但是,它允許在發出訊號時省略任何可選引數。
與PyQt4不同,PyQt5支援在未從QObject中分類的類中定義屬性,訊號和槽(即在mixins中)。
QtDeclarative
,QtScript
和QtScriptTools
模組
PyQt4中的QtDeclarative
,QtScript
並且QtScriptTools
模組不支援。這些已被PyQt5的QtQml和 QtQuick模組取代。與PyQt4不同,PyQt5支援從QML建立Python物件。
QtGui
模組
PyQt4的QtGui
模組已經拆分為PyQt5的QtGui, QtPrintSupport和QtWidgets模組。
QtOpenGL
模組
PyQt5僅 支援QGLContext, QGLFormat和QGLWidget類。
QtWebKit
模組
PyQt4的QtWebKit
模組已經拆分為PyQt5的 QtWebKit和QtWebKitWidgets模組。
pyqtconfig
模組
PyQt4的pyqtconfig
模組不受支援。本節 將PyQt5擴充套件API介紹PyQt5提供給第三方軟體包(如支援 QScintilla希望建立在PyQt5的頂部)。
dbus.mainloop.qt
模組
PyQt4的dbus.mainloop.qt
模組在PyQt5中被稱為dbus.mainloop.pyqt5。這允許它們並排安裝。它們的功能完全相同。
QDataStream
的readUInt8()
, readInt8()
, writeUInt8()
和 writeInt8()
方法都被解讀讀取和寫入的數值的數值。在PyQt4中,它們被解釋為單個字串。
QFileDialog
的getOpenFileNameAndFilter()
,getOpenFileNamesAndFilter()
和 getSaveFileNameAndFilter()
PyQt4中的方法QFileDialog
現在已經改名getOpenFileName()
, getOpenFileNames()
並 getSaveFileName()
分別在PyQt5。PyQt4的實現getOpenFileName()
,getOpenFileNames()
並且 getSaveFileName()
在PyQt5中不受支援。
QGraphicsItemAnimation
QGraphicsItemAnimation
已刪除對已棄用類的支援。如果移植現有的PyQt4應用程式,則考慮首先更新它以使用QPropertyAnimation。
QMatrix
QMatrix
已刪除對已棄用類的支援。如果移植現有的PyQt4應用程式,則考慮首先更新它以使用 QTransform。
QPyTextObject
PyQt4實現了QPyTextObject
一種解決方法,無法定義一個從多個Qt類中細分的Python類。PyQt5確實支援定義一個Python類的能力,該類從多個Qt類中進行子類化,只要其中一個Qt類是介面,即它們已經在C ++中使用宣告Q_DECLARE_INTERFACE
。因此QPyTextObject
在PyQt5中沒有實現。
QSet
在PyQt4中,QSet
實現為Python v2中的列表和Python v3中的集合。在PyQt5 QSet
中始終作為一個集合實現。
pyuic5
pyuic5不支援--pyqt3-wrapper
標誌pyuic4
。
pyrcc5
pyrcc5不支援-py2
和-py3
標誌 pyrcc4
。pyrcc5的輸出與從Python v2.6開始的所有Python版本相容。
合作多繼承
與PyQt4不同,PyQt5類實現了協作多繼承。換句話說,PyQt5類在它們的__init__
方法中總是相當於以下Python v3程式碼(其中kwds
是未使用的關鍵字引數的字典):
super().__init__(**kwds)
這意味著那些未使用的關鍵字引數將傳遞給__init__
任何mixin類的方法。那些mixin類必須合作,即如果他們有自己的__init__
實現,他們必須進行類似的呼叫。
在PyQt4中使用多重繼承時,通常會__init__
顯式呼叫超類的方法,例如:
class MyQObject(QObject, MyMixin):
def __init__(self, parent, mixin_arg):
QObject.__init__(self, parent)
MyMixin.__init__(self, mixin_arg)
# Other initialisation...
在PyQt5中,上面會MyMixin.__init__
被呼叫兩次。相反,它應該實現如下:
class MyQObject(QObject, MyMixin):
def __init__(self, **kwds):
super().__init__(**kwds)
# Other initialisation...
請注意,如果沒有其他初始化要做,則__init__
實際上不需要該方法。
mixin類應該如下實現:
class MyMixin:
def __init__(self, mixin_arg, **kwds):
super().__init__(**kwds)
# Other initialisation...
如果一個類只從一個類繼承,那麼它仍然可以__init__
顯式地呼叫超類的方法(儘管建議使用它 super()
)。
請參閱對協作多繼承的支援。
釋出
GIL僅在已知需要時才會釋出。PyQt4在呼叫Qt時總是釋放GIL。
退出時的物件銷燬
當Python直譯器退出PyQt4(預設情況下)時,呼叫它擁有的所有包裝例項的C ++解構函式。這是以隨機順序發生的,因此可能導致解釋程式崩潰。可以通過呼叫該sip.setdestroyonexit()
函式禁用此行為。PyQt5總是sip.setdestroyonexit()
自動呼叫 。