PyQt6 和 PyQt5 的差异

PyQt6 和 PyQt5 的差异

PyQt6 是 PyQt5 的下一个版本,但两个版本的写法基本上其实大同小异,这篇教学会介绍 PyQt6 和 PyQt5 有何差异。

快速预览:

  • .exec_() 改为 .exec()

  • 方法的位置或名称改变

  • 不需要高 DPI 缩放属性

  • 支援 Qt的资源

  • 特定平台

  • 其他细节差异

PyQt6 和 PyQt5 的差异_第1张图片

PyQt6 教学 - PyQt6 和 PyQt5 的差异

.exec_() 改为 .exec()

在 Python 2.7 中,exec 是一个保留字,使用者不可将这个字作为变数、函数或方法的名称的字,在 PyQt 的早期版本中,该方法被重命名为 ,并在后面加上底线避免命名衝突。然而在 Python 3.0 之后的版本删除了 exec 关键字,也由于 PyQt6 只支援 Python 3.x 的版本,所以就将 改为 。.exec_()``.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
设置方向(1) setOrientation(QtCore.Qt.Orientation.Horizontal)
设置方向(2) setOrientation(QtCore.Qt.Orientation.Vertical)
QSlider.TicksAbove QSlider.TickPosition.TicksAbove
QSlider.Ticks下面 QSlider.TickPosition.TicksUnder
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.Style斜体 QFont.Style.Style斜体
Qt.DotLine Qt.PenStyle.DotLine
Qt.FlatCap Qt.PenCapStyle.FlatCap
Qt.Miter加入 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

布局

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.已检查 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的资源

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

本地:

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() 的 而不是 QOpenGLContext() 的。.get()

  • QWidget.mapToGlobal()和 返回一个 QPoinF 对象。QWidget.mapFromGlobal()

     

你可能感兴趣的:(QT6教学,qt,python,开发语言)