Add backend for Qt6 (support for PyQt6, PySide6) #19674
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
PR Summary
This PR adds support for Qt6, with support for both PyQt6 and PySide6 libraries.
For the most part PySide6 is source-compatible with PySide2, aside from the imports and some small changes (see below). PyQt6 is quite different. The main changes that affect us here are
Enums
are no longer available at the top level of modules/objects. For example, previouslyQt.GlobalColor.white
was previously available asQt.white
. This short style was present in PyQt5 & PySide2 and is still supported in PySide6. PySide6 also supports the longer version (but...)Qt.GlobalColor.white
(enum) is the same in both. But alignment flags are inQt.Alignment.AlignLeft
in PyQt6 andQt.AlignmentFlag.AlignLeft
in PySide6..pos()
attribute. We can use.position()
instead.exec_()
, must useexec()
. PySide6 is exactly the reverse.Qt.MidButton
is nowQt.MiddleButton
The code to work around these differences is in
qt_compat.py
. Because of the differences in flag naming, I've opted to just copy the entries from the enums/flags to the parent object (matching PyQt5/PySide2). There is a further shim for QDialog to account for PyQt no longer havingexec_()
.Since this adds new files, the diff doesn't show the changes. Below is a diff between v5 and v6.
The differences being so minor, it may make sense to implement Qt6 based on Qt5 (or both vs a base).
PR Checklist
pytest
passes).flake8
on changed files to check).flake8-docstrings
and runflake8 --docstring-convention=all
).doc/users/next_whats_new/
(follow instructions in README.rst there).doc/api/next_api_changes/
(follow instructions in README.rst there).