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