admin 發表於 2023-3-31 23:57:25

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().size().width()
QtWidgets.height()         QtWidgets.QApplication.screens().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 對象。

參考資料

      https://www.riverbankcomputing.c ... t5_differences.html
      https://www.pythonguis.com/faq/pyqt5-vs-pyqt6/

In Qt6 the QAction class, which is used for creation toolbars and menus, has been moved from the QtWidgets to the QtGui module.



頁: [1]
查看完整版本: PyQt6 和 PyQt5 的差異