1. 程式人生 > >PyQt4和PyQt5之間的差異

PyQt4和PyQt5之間的差異

    PyQt4和PyQt5之間的差異

PyQt5與PyQt4不相容(儘管經驗表明將應用程式從PyQt4移植到PyQt5的工作量並不大)。本節介紹兩者之間的主要區別。

    支援的Python版本

不支援早於v2.6的Python版本。

 

    不推薦使用的功能

PyQt5不支援在Qt v5.0中標記為已棄用或已過時的Qt API的任何部分。然而,其中一些可能是偶然包括在內的。這些被視為錯誤,如果找到則將被刪除。

   多個

PyQt4中支援多種不同的API的版本(QString

, 的QVariant等)。除 QVariant外,PyQt5僅為所有版本的Python實現這些API的v2。支援QVariantQPyNullVariant中描述了對QVariant的更改支援 ,包括刪除 。

 

    舊式訊號和插槽

不支援PyQt4的舊式訊號和插槽。因此,PyQt5中未實現以下內容:

  • QObject.connect()
  • QObject.emit()
  • SIGNAL()
  • SLOT()

所有具有引數的方法通常是呼叫 SIGNAL()SLOT()不再受支援的結果。將始終存在分別採用繫結訊號或可呼叫的等效項。

此外,以下方法有所不同:

  • disconnect()不接受任何引數並斷開與QObject例項的所有連線。

 

    新式訊號和插槽

Qt將帶有可選引數的訊號實現為兩個獨立的訊號,一個帶有引數,一個帶有引數。PyQt4暴露了這兩個允許你連線到它們中的每一個。但是,在發出訊號時,必須使用適合於發出的引數數量的訊號。

PyQt5僅公開指定所有引數的訊號。但是,它允許在發出訊號時省略任何可選引數。

與PyQt4不同,PyQt5支援在未從QObject中分類的類中定義屬性,訊號和槽(即在mixins中)。

 

  QtDeclarative
QtScriptQtScriptTools模組

PyQt4中的QtDeclarativeQtScript並且QtScriptTools模組不支援。這些已被PyQt5的QtQml和 QtQuick模組取代。與PyQt4不同,PyQt5支援從QML建立Python物件。

 QtGui模組

PyQt4的QtGui模組已經拆分為PyQt5的QtGui, QtPrintSupportQtWidgets模組。

 QtOpenGL模組

PyQt5僅 支援QGLContext, QGLFormatQGLWidget類。

 QtWebKit模組

PyQt4的QtWebKit模組已經拆分為PyQt5的 QtWebKitQtWebKitWidgets模組。

 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標誌 pyrcc4pyrcc5的輸出與從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()自動呼叫 。