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中)。

  QtDeclarativeQtScriptQtScriptTools模块

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()自动调用 。

猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/84646308