diff --git a/README.rst b/README.rst
index 433c6a1d82f..806f5469e1d 100644
--- a/README.rst
+++ b/README.rst
@@ -88,12 +88,12 @@ For full functionality, some functions require:
- `scikit-learn `__ ≥ 1.0
- `Joblib `__ ≥ 0.15 (for parallelization)
- `mne-qt-browser `__ ≥ 0.1 (for fast raw data visualization)
-- `Qt `__ ≥ 5.12 via one of the following bindings (for fast raw data visualization and interactive 3D visualization):
+- `Qt `__ ≥ 5.15 via one of the following bindings (for fast raw data visualization and interactive 3D visualization):
- `PyQt6 `__ ≥ 6.0
- `PySide6 `__ ≥ 6.0
- - `PyQt5 `__ ≥ 5.12
- - `PySide2 `__ ≥ 5.12
+ - `PyQt5 `__ ≥ 5.15
+ - `PySide2 `__ ≥ 5.15
- `Numba `__ ≥ 0.54.0
- `NiBabel `__ ≥ 3.2.1
diff --git a/doc/changes/devel/dependency.rst b/doc/changes/devel/dependency.rst
new file mode 100644
index 00000000000..423082320ca
--- /dev/null
+++ b/doc/changes/devel/dependency.rst
@@ -0,0 +1 @@
+The minimum supported version of Qt bindings is 5.15, by `Eric Larson`_.
diff --git a/mne/viz/backends/_utils.py b/mne/viz/backends/_utils.py
index 56405bc3cdb..123546db035 100644
--- a/mne/viz/backends/_utils.py
+++ b/mne/viz/backends/_utils.py
@@ -274,84 +274,42 @@ def _qt_detect_theme():
def _qt_get_stylesheet(theme):
_validate_type(theme, ("path-like",), "theme")
theme = str(theme)
- orig_theme = theme
- system_theme = None
- stylesheet = ""
- extra_msg = ""
- if theme == "auto":
- theme = system_theme = _qt_detect_theme()
- if theme in ("dark", "light"):
- if system_theme is None:
- system_theme = _qt_detect_theme()
- qt_version, api = _check_qt_version(return_api=True)
- # On macOS, we shouldn't need to set anything when the requested theme
- # matches that of the current OS state
- if sys.platform == "darwin":
- extra_msg = f"when in {system_theme} mode on macOS"
- # But before 5.13, we need to patch some mistakes
- if sys.platform == "darwin" and theme == system_theme:
- if theme == "dark" and _compare_version(qt_version, "<", "5.13"):
- # Taken using "Digital Color Meter" on macOS 12.2.1 looking at
- # Meld, and also adapting (MIT-licensed)
- # https://github.com/ColinDuquesnoy/QDarkStyleSheet/blob/master/qdarkstyle/dark/style.qss # noqa: E501
- # Something around rgb(51, 51, 51) worked as the bgcolor here,
- # but it's easy enough just to set it transparent and inherit
- # the bgcolor of the window (which is the same). We also take
- # the separator images from QDarkStyle (MIT).
- icons_path = _qt_init_icons()
- stylesheet = """\
-QStatusBar {
- border: 1px solid rgb(76, 76, 75);
- background: transparent;
-}
-QStatusBar QLabel {
- background: transparent;
-}
-QToolBar {
- background-color: transparent;
- border-bottom: 1px solid rgb(99, 99, 99);
-}
-QToolBar::separator:horizontal {
- width: 16px;
- image: url("%(icons_path)s/toolbar_separator_horizontal@2x.png");
-}
-QToolBar::separator:vertical {
- height: 16px;
- image: url("%(icons_path)s/toolbar_separator_vertical@2x.png");
-}
-QToolBar::handle:horizontal {
- width: 16px;
- image: url("%(icons_path)s/toolbar_move_horizontal@2x.png");
-}
-QToolBar::handle:vertical {
- height: 16px;
- image: url("%(icons_path)s/toolbar_move_vertical@2x.png");
-}
-""" % dict(icons_path=icons_path)
+ stylesheet = "" # no stylesheet
+ if theme in ("auto", "dark", "light"):
+ if theme == "auto":
+ return stylesheet
+ assert theme in ("dark", "light")
+ system_theme = _qt_detect_theme()
+ if theme == system_theme:
+ return stylesheet
+ _, api = _check_qt_version(return_api=True)
+ # On macOS or Qt 6, we shouldn't need to set anything when the requested
+ # theme matches that of the current OS state
+ try:
+ import qdarkstyle
+ except ModuleNotFoundError:
+ logger.info(
+ f'To use {theme} mode when in {system_theme} mode, "qdarkstyle" has'
+ "to be installed! You can install it with:\n"
+ "pip install qdarkstyle\n"
+ )
else:
- # Here we are on non-macOS (or on macOS but our sys theme does not
- # match the requested theme)
- if api in ("PySide6", "PyQt6"):
- if orig_theme != "auto" and not (theme == system_theme == "light"):
- warn(
- f"Setting theme={repr(theme)} is not yet supported "
- f"for {api} in qdarkstyle, it will be ignored"
- )
+ if api in ("PySide6", "PyQt6") and _compare_version(
+ qdarkstyle.__version__, "<", "3.2.3"
+ ):
+ warn(
+ f"Setting theme={repr(theme)} is not supported for {api} in "
+ f"qdarkstyle {qdarkstyle.__version__}, it will be ignored. "
+ "Consider upgrading qdarkstyle to >=3.2.3."
+ )
else:
- try:
- import qdarkstyle
- except ModuleNotFoundError:
- logger.info(
- f'To use {theme} mode{extra_msg}, "qdarkstyle" has to '
- "be installed! You can install it with:\n"
- "pip install qdarkstyle\n"
- )
- else:
- klass = getattr(
+ stylesheet = qdarkstyle.load_stylesheet(
+ getattr(
getattr(qdarkstyle, theme).palette,
f"{theme.capitalize()}Palette",
)
- stylesheet = qdarkstyle.load_stylesheet(klass)
+ )
+ return stylesheet
else:
try:
file = open(theme)
@@ -363,8 +321,7 @@ def _qt_get_stylesheet(theme):
else:
with file as fid:
stylesheet = fid.read()
-
- return stylesheet
+ return stylesheet
def _should_raise_window():