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