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 對象。
參考資料
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~