PyQt5与PyQt4不兼容(尽管经验表明将应用程序从PyQt4移植到PyQt5的工作量并不大)。本节介绍两者之间的主要区别。
不支持早于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()
自动调用 。