PyQt6 和 PyQt5 的差异
PyQt6 是 PyQt5 的下一个版本,但两个版本的写法基本上其实大同小异,这篇教学会介绍 PyQt6 和 PyQt5 有何差异。
快速导览:
.exec_() 改为 .exec()
在 Python 2.7 中,exec 是一个保留字,用户不可将这个字作为变数、函数或方法的名称的字,在 PyQt 的早期版本中,该方法被重命名为 .exec_(),并在后面加上底线避免命名冲突。然而在 Python 3.0 之后的版本删除了 exec 关键字,也由于 PyQt6 只支援 Python 3.x 的版本,所以就将 .exec_() 改为 .exec()。
方法的位置或名称改变
PyQt6 针对各个种类的 Enums 位置进行重大的改变。所有的 Enums 被归类到标准 Python 的 Enum 类里作为子类别,并需要全名才能使用,下方列出 PyQt5 和 PyQt6 在使用上的差异。
函数库安装
| PyQt5 | PyQt6 |
|---|---|
| pip install PyQtWebEngine | pip install PyQt6-WebEngine |
数值调整滑杆
| PyQt5 | PyQt6 |
|---|---|
| QtWidgets.QLineEdit.Password | QtWidgets.QLineEdit.EchoMode.Password |
| setOrientation(1) | setOrientation(QtCore.Qt.Orientation.Horizontal) |
| setOrientation(2) | setOrientation(QtCore.Qt.Orientation.Vertical) |
| QSlider.TicksAbove | QSlider.TickPosition.TicksAbove |
| QSlider.TicksBelow | QSlider.TickPosition.TicksBelow |
| QSlider.TicksBothSides | QSlider.TickPosition.TicksBothSides |
| QSlider.TicksLeft | QSlider.TickPosition.TicksLeft |
| QSlider.TicksRight | QSlider.TickPosition.TicksRight |
消息文件对话视窗
| PyQt5 | PyQt6 |
|---|---|
| QMessageBox.Information | QMessageBox.Icon.Information |
| QMessageBox.Warning | QMessageBox.Icon.Warning |
| QMessageBox.Critical | QMessageBox.Icon.Critical |
| QMessageBox.Question | QMessageBox.Icon.Question |
| QMessageBox.Question | QMessageBox.Icon.Question |
| QMessageBox.Ok | QMessageBox.StandardButton.Ok |
| QMessageBox.Open | QMessageBox.StandardButton.Open |
| QMessageBox.Save | QMessageBox.StandardButton.Save |
| QMessageBox.Cancel | QMessageBox.StandardButton.Cancel |
| QMessageBox.Close | QMessageBox.StandardButton.Close |
| QMessageBox.Discard | QMessageBox.StandardButton.Discard |
| QMessageBox.Apply | QMessageBox.StandardButton.Apply |
画笔和颜色
| PyQt5 | PyQt6 |
|---|---|
| QtWidgets.QAction | QtGui.QAction |
| QFont.StyleItalic | QFont.Style.StyleItalic |
| Qt.DotLine | Qt.PenStyle.DotLine |
| Qt.FlatCap | Qt.PenCapStyle.FlatCap |
| Qt.MiterJoin | Qt.PenJoinStyle.MiterJoin |
| QImage.Format_RGB888 | QImage.Format.Format_RGB888 |
对齐相关
| PyQt5 | PyQt6 |
|---|---|
| QtCore.Qt.AlignLeft | QtCore.Qt.AlignmentFlag.AlignLeft |
| QtCore.Qt.AlignCenter | QtCore.Qt.AlignmentFlag.AlignCenter |
| QtCore.Qt.AlignRight | QtCore.Qt.AlignmentFlag.AlignRight |
| QtCore.Qt.AlignTop | QtCore.Qt.AlignmentFlag.AlignTop |
| QtCore.Qt.AlignBottom | QtCore.Qt.AlignmentFlag.AlignBottom |
| QtWidgets.QListView.TopToBottom | QtWidgets.QListView.Flow.TopToBottom |
| QtWidgets.QListView.LeftToRight | QtWidgets.QListView.Flow.LeftToRight |
Layout 布局
| PyQt5 | PyQt6 |
|---|---|
| QtCore.Qt.AlignRight | QtCore.Qt.AlignmentFlag.AlignRight |
| QtCore.Qt.AlignVCenter | QtCore.Qt.AlignmentFlag.AlignVCenter |
| QtCore.Qt.AlignHCenter | QtCore.Qt.AlignmentFlag.AlignHCenter |
| QtWidgets.QFormLayout.DontWrapRows | QtWidgets.QFormLayout.RowWrapPolicy.DontWrapRows |
| QtWidgets.QFormLayout.WrapLongRows | QtWidgets.QFormLayout.RowWrapPolicy.WrapLongRows |
| QtWidgets.QFormLayout.WrapAllRows | QtWidgets.QFormLayout.RowWrapPolicy.WrapAllRows |
鼠标、键盘与视窗
| PyQt5 | PyQt6 |
|---|---|
| QMouseEvent.x() | QEnterEvent.position(event).x() |
| QMouseEvent.y() | QEnterEvent.position(event).y() |
| QMouseEvent.globalX() | QEnterEvent.globalPosition(event).x() |
| QMouseEvent.globalY() | QEnterEvent.globalPosition(event).y() |
| QMouseEvent.button() | QEnterEvent.button(event) |
| QMouseEvent.timestamp() | QEnterEvent.timestamp(event) |
| QtWidgets.QShortcut | QtGui.QShortcut |
| Qt.Checked | Qt.CheckState.Checked |
| QtWidgets.width() | QtWidgets.QApplication.screens()[0].size().width() |
| QtWidgets.height() | QtWidgets.QApplication.screens()[0].size().height() |
不需要高 DPI 缩放属性
因为高 DPI 是 PyQt6 的默认设定,因此不需要再使用下列高 DPI 缩放属性的设定。
Qt.AA_EnableHighDpiScaling
Qt.AA_DisableHighDpiScaling
Qt.AA_UseHighDpiPixmaps
不支援 Qt’s resource
PyQt6 已经不再支援 Qt 资源框架 ( Qt’s resource ),如果要将程序码和资源打包成应用程序,可以使用 PyInstaller 进行打包作业。
特定平台
PyQt6 弃用了 QtWin 和 QtMac 模组中支援特定平台的方法,转而使用本机调用。
QtWin:
try:
# Include in try/except block if you're also targeting Mac/Linux
from PyQt5.QtWinExtras import QtWin
myappid = 'com.learnpyqt.examples.helloworld'
QtWin.setCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
pass
Native:
try:
# Include in try/except block if you're also targeting Mac/Linux
from ctypes import windll # Only exists on Windows.
myappid = 'mycompany.myproduct.subproduct.version'
windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
except ImportError:
pass
其他细节差异
- QDesktopWidget 已经被移除,使用 QScreen 代替 ( 可以使用
QWidget.screen(),QGuiApplication.primaryScreen(),或QGuiApplication.screens())。QFontMetrics的.width()已重命名为horizontaladvance()。Qt.MidButton已重命名为Qt.MiddleButton。- QRegExp 改为 QRegularExpression。
- 推荐使用 QOpenGLVersionFunctionsFactory() 的
.get()而不是 QOpenGLContext() 的。QWidget.mapToGlobal()和QWidget.mapFromGlobal()返回一个 QPoinF 对象。
参考数据
微信扫码关注
抖音扫码关注