diff --git a/.github/workflows/lint-and-build.yml b/.github/workflows/lint-and-build.yml
index cf1e5933..2cc32c45 100644
--- a/.github/workflows/lint-and-build.yml
+++ b/.github/workflows/lint-and-build.yml
@@ -12,6 +12,7 @@ on:
branches:
- main
- master
+ - dev*
paths:
- "**.py"
- "**.ui"
diff --git a/pyproject.toml b/pyproject.toml
index 2dc12a42..f42167f0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -131,7 +131,7 @@ reportUnusedCallResult = "none"
reportMissingTypeStubs = "warning"
# False positives with TYPE_CHECKING
reportImportCycles = "information"
-# False positives with PyQt .connect
+# False positives with PySide .connect
reportFunctionMemberAccess = "none"
# Extra runtime safety
reportUnnecessaryComparison = "warning"
diff --git a/res/design.ui b/res/design.ui
index 7d67e0e0..afb56b1d 100644
--- a/res/design.ui
+++ b/res/design.ui
@@ -32,9 +32,7 @@
- :/resources/icon.ico
- :/resources/icon.ico
-
+ :/resources/icon.ico:/resources/icon.ico
@@ -974,6 +972,9 @@
F1
+
+ Qt::ApplicationShortcut
+
@@ -990,6 +991,9 @@
Ctrl+S
+
+ Qt::ApplicationShortcut
+
@@ -998,6 +1002,9 @@
Ctrl+O
+
+ Qt::ApplicationShortcut
+
@@ -1006,6 +1013,9 @@
Ctrl+Shift+S
+
+ Qt::ApplicationShortcut
+
@@ -1019,6 +1029,9 @@
Ctrl+,
+
+ Qt::ApplicationShortcut
+
QAction::PreferencesRole
diff --git a/scripts/compile_resources.ps1 b/scripts/compile_resources.ps1
index 909036fe..c7eba061 100644
--- a/scripts/compile_resources.ps1
+++ b/scripts/compile_resources.ps1
@@ -2,11 +2,17 @@ $originalDirectory = $pwd
Set-Location "$PSScriptRoot/.."
New-Item -Force -ItemType directory ./src/gen | Out-Null
-pyuic6 './res/about.ui' -o './src/gen/about.py'
-pyuic6 './res/design.ui' -o './src/gen/design.py'
-pyuic6 './res/settings.ui' -o './src/gen/settings.py'
-pyuic6 './res/update_checker.ui' -o './src/gen/update_checker.py'
+pyside6-uic './res/about.ui' -o './src/gen/about.py'
+pyside6-uic './res/design.ui' -o './src/gen/design.py'
+pyside6-uic './res/settings.ui' -o './src/gen/settings.py'
+pyside6-uic './res/update_checker.ui' -o './src/gen/update_checker.py'
pyside6-rcc './res/resources.qrc' -o './src/gen/resources_rc.py'
+$files = Get-ChildItem ./src/gen/ *.py
+foreach ($file in $files) {
+ (Get-Content $file.PSPath) |
+ ForEach-Object { $_ -replace 'import resources_rc', 'from . import resources_rc' } |
+ Set-Content $file.PSPath
+}
Write-Host 'Generated code from .ui files'
$build_vars_path = "$PSScriptRoot/../src/gen/build_vars.py"
diff --git a/scripts/requirements-dev.txt b/scripts/requirements-dev.txt
index 7295139f..8b02dc5f 100644
--- a/scripts/requirements-dev.txt
+++ b/scripts/requirements-dev.txt
@@ -11,9 +11,9 @@ add-trailing-comma>=2.3.0 # Added support for with statement
autopep8>=2.0.0 # New checks
ruff>=0.0.262 # Avoid N802 violations for @override + Avoid adding required imports to stub files
#
-# Run `./scripts/designer.ps1` to quickly open the bundled PyQt Designer.
+# Run `./scripts/designer.ps1` to quickly open the bundled Qt Designer.
# Can also be downloaded externally as a non-python package
-qt6-applications
+# qt6-applications
# Types
types-d3dshot
types-keyboard
diff --git a/scripts/requirements.txt b/scripts/requirements.txt
index 4dace4f7..a611e047 100644
--- a/scripts/requirements.txt
+++ b/scripts/requirements.txt
@@ -5,10 +5,12 @@
# Usage: ./scripts/install.ps1
#
# If you're having issues with the libraries, you might want to first run:
-# pip uninstall -y -r ./scripts/requirements-dev.txt
+# pip uninstall -y -r ./scripts/requirements-dev.txt PySide6 shiboken6
#
# Creating an AutoSplit executable with PyInstaller: ./scripts/build.ps1
#
+# PySide6 dev wheels: https://download.qt.io/snapshots/ci/pyside/dev/?C=M;O=D
+#
# Dependencies:
certifi
ImageHash>=4.3.1 # Contains type information + setup as package not module
@@ -19,9 +21,7 @@ packaging
Pillow>=9.2 # gnome-screeshot checks
psutil
PyAutoGUI
-# 6.4.1 fixes the rare Illegal Operation issue from RTADan, but the dev wheels are currently broken :/
-# 2.0.0-beta.2 contains the fixes if anyone needs it.
-PyQt6>=6.4.0 # Python 3.11 support
+PySide6-Essentials>=6.5 # fixes https://bugreports.qt.io/browse/PYSIDE-2189 and https://bugreports.qt.io/browse/PYSIDE-1603
requests<=2.28.1 # 2.28.2 has issues with PyInstaller https://github.com/pyinstaller/pyinstaller-hooks-contrib/issues/534
toml
typing-extensions>=4.4.0 # @override decorator support
@@ -29,7 +29,6 @@ typing-extensions>=4.4.0 # @override decorator support
# Build and compile resources
pyinstaller>=5.5 # Python 3.11 support
pyinstaller-hooks-contrib>=2022.9 # opencv-python 4.6 support. Changes for pywintypes and comtypes
-PySide6-Essentials>=6.4.0.1 # Python 3.11 support
#
# https://peps.python.org/pep-0508/#environment-markers
#
diff --git a/src/AutoControlledWorker.py b/src/AutoControlledThread.py
similarity index 94%
rename from src/AutoControlledWorker.py
rename to src/AutoControlledThread.py
index 5b3238c1..f5e518a8 100644
--- a/src/AutoControlledWorker.py
+++ b/src/AutoControlledThread.py
@@ -2,7 +2,7 @@
from typing import TYPE_CHECKING
-from PyQt6 import QtCore
+from PySide6 import QtCore
import error_messages
import user_profile
@@ -11,11 +11,12 @@
from AutoSplit import AutoSplit
-class AutoControlledWorker(QtCore.QObject):
+class AutoControlledThread(QtCore.QThread):
def __init__(self, autosplit: AutoSplit):
self.autosplit = autosplit
super().__init__()
+ @QtCore.Slot()
def run(self):
while True:
try:
diff --git a/src/AutoSplit.py b/src/AutoSplit.py
index d961c84f..f245078f 100644
--- a/src/AutoSplit.py
+++ b/src/AutoSplit.py
@@ -5,21 +5,22 @@
import os
import signal
import sys
+from collections.abc import Callable
from time import time
from types import FunctionType
-from typing import NoReturn
+from typing import NoReturn, Optional
import certifi
import cv2
+from AutoControlledThread import AutoControlledThread
from psutil import process_iter
-from PyQt6 import QtCore, QtGui
-from PyQt6.QtTest import QTest
-from PyQt6.QtWidgets import QApplication, QFileDialog, QLabel, QMainWindow, QMessageBox, QWidget
+from PySide6 import QtCore, QtGui
+from PySide6.QtTest import QTest
+from PySide6.QtWidgets import QApplication, QFileDialog, QLabel, QMainWindow, QMessageBox
from typing_extensions import override
import error_messages
import user_profile
-from AutoControlledWorker import AutoControlledWorker
from AutoSplitImage import START_KEYWORD, AutoSplitImage, ImageType
from capture_method import CaptureMethodBase, CaptureMethodEnum
from gen import about, design, settings, update_checker
@@ -49,11 +50,14 @@
)
CHECK_FPS_ITERATIONS = 10
+DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 2
# Needed when compiled, along with the custom hook-requests PyInstaller hook
os.environ["REQUESTS_CA_BUNDLE"] = certifi.where()
myappid = f"Toufool.AutoSplit.v{AUTOSPLIT_VERSION}"
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
+# qt.qpa.window: SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) failed: COM error 0x5: Access is denied. # noqa: E501 # pylint: disable=line-too-long
+# ctypes.windll.user32.SetProcessDpiAwarenessContext(2)
class AutoSplit(QMainWindow, design.Ui_MainWindow):
@@ -61,16 +65,16 @@ class AutoSplit(QMainWindow, design.Ui_MainWindow):
is_auto_controlled = "--auto-controlled" in sys.argv
# Signals
- start_auto_splitter_signal = QtCore.pyqtSignal()
- reset_signal = QtCore.pyqtSignal()
- skip_split_signal = QtCore.pyqtSignal()
- undo_split_signal = QtCore.pyqtSignal()
- pause_signal = QtCore.pyqtSignal()
- after_setting_hotkey_signal = QtCore.pyqtSignal()
- update_checker_widget_signal = QtCore.pyqtSignal(str, bool)
- load_start_image_signal = QtCore.pyqtSignal([], [bool], [bool, bool])
+ start_auto_splitter_signal = QtCore.Signal()
+ reset_signal = QtCore.Signal()
+ skip_split_signal = QtCore.Signal()
+ undo_split_signal = QtCore.Signal()
+ pause_signal = QtCore.Signal()
+ after_setting_hotkey_signal = QtCore.Signal()
+ update_checker_widget_signal = QtCore.Signal(str, bool)
+ load_start_image_signal = QtCore.Signal(type[Optional[bool]], type[Optional[bool]])
# Use this signal when trying to show an error from outside the main thread
- show_error_signal = QtCore.pyqtSignal(FunctionType)
+ show_error_signal = QtCore.Signal(FunctionType)
# Timers
timer_live_image = QtCore.QTimer()
@@ -110,13 +114,15 @@ class AutoSplit(QMainWindow, design.Ui_MainWindow):
reset_image: AutoSplitImage | None = None
split_images: list[AutoSplitImage] = []
split_image: AutoSplitImage | None = None
- update_auto_control: QtCore.QThread | None = None
+ update_auto_control: AutoControlledThread | None = None
- def __init__(self, parent: QWidget | None = None): # noqa: PLR0915
- super().__init__(parent)
+ def __init__(self): # noqa: PLR0915
+ super().__init__()
# Setup global error handling
- self.show_error_signal.connect(lambda error_message_box: error_message_box())
+ def _show_error_signal_slot(error_message_box: Callable[..., object]):
+ return error_message_box()
+ self.show_error_signal.connect(_show_error_signal_slot)
sys.excepthook = error_messages.make_excepthook(self)
self.setupUi(self)
@@ -146,10 +152,7 @@ def __init__(self, parent: QWidget | None = None): # noqa: PLR0915
print(f"{AUTOSPLIT_VERSION}\n{os.getpid()}", flush=True)
# Use and Start the thread that checks for updates from LiveSplit
- self.update_auto_control = QtCore.QThread()
- worker = AutoControlledWorker(self)
- worker.moveToThread(self.update_auto_control)
- self.update_auto_control.started.connect(worker.run)
+ self.update_auto_control = AutoControlledThread(self)
self.update_auto_control.start()
# split image folder line edit text
@@ -162,23 +165,10 @@ def __init__(self, parent: QWidget | None = None): # noqa: PLR0915
self.action_about_qt_for_python.triggered.connect(about_qt_for_python)
self.action_check_for_updates.triggered.connect(lambda: check_for_updates(self))
self.action_settings.triggered.connect(lambda: open_settings(self))
- # PyQt6 typing is wrong
- self.action_save_profile.triggered.connect(
- lambda: user_profile.save_settings(self), # pyright: ignore[reportGeneralTypeIssues]
- )
- self.action_save_profile_as.triggered.connect(
- lambda: user_profile.save_settings_as(self), # pyright: ignore[reportGeneralTypeIssues]
- )
+ self.action_save_profile.triggered.connect(lambda: user_profile.save_settings(self))
+ self.action_save_profile_as.triggered.connect(lambda: user_profile.save_settings_as(self))
self.action_load_profile.triggered.connect(lambda: user_profile.load_settings(self))
- # Shortcut context can't be set through the designer because of a bug in pyuic6 that generates invalid code
- # Email sent to pyqt@riverbankcomputing.com
- self.action_view_help.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut)
- self.action_settings.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut)
- self.action_save_profile.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut)
- self.action_save_profile_as.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut)
- self.action_load_profile.setShortcutContext(QtCore.Qt.ShortcutContext.ApplicationShortcut)
-
# Connecting button clicks to functions
self.browse_button.clicked.connect(self.__browse)
self.select_region_button.clicked.connect(lambda: select_region(self))
@@ -206,12 +196,12 @@ def __init__(self, parent: QWidget | None = None): # noqa: PLR0915
# connect signals to functions
self.after_setting_hotkey_signal.connect(lambda: after_setting_hotkey(self))
self.start_auto_splitter_signal.connect(self.__auto_splitter)
- self.update_checker_widget_signal.connect(
- lambda latest_version, check_on_open: open_update_checker(self, latest_version, check_on_open),
- )
+
+ def _update_checker_widget_signal_slot(latest_version: str, check_on_open: bool):
+ return open_update_checker(self, latest_version, check_on_open)
+ self.update_checker_widget_signal.connect(_update_checker_widget_signal_slot)
+
self.load_start_image_signal.connect(self.__load_start_image)
- self.load_start_image_signal[bool].connect(self.__load_start_image)
- self.load_start_image_signal[bool, bool].connect(self.__load_start_image)
self.reset_signal.connect(self.reset)
self.skip_split_signal.connect(self.skip_split)
self.undo_split_signal.connect(self.undo_split)
@@ -699,6 +689,8 @@ def __similarity_threshold_loop(self, number_of_split_images: int, dummy_splits_
QTest.qWait(wait_delta_ms)
+ return False
+
def __pause_loop(self, stop_time: float, message: str):
"""
Wait for a certain time and show the timer to the user.
@@ -785,7 +777,7 @@ def gui_changes_on_reset(self, safe_to_reload_start_image: bool = False):
QApplication.processEvents()
if safe_to_reload_start_image:
- self.load_start_image_signal[bool, bool].emit(False, False)
+ self.load_start_image_signal.emit(False, False)
def __get_capture_for_comparison(self):
"""Grab capture region and resize for comparison."""
@@ -867,15 +859,15 @@ def __update_split_image(self, specific_image: AutoSplitImage | None = None):
self.image_loop_value_label.setText(f"{loop_tuple[1]}/{loop_tuple[0].loops}")
@override
- def closeEvent(self, a0: QtGui.QCloseEvent | None = None):
+ def closeEvent(self, event: QtGui.QCloseEvent | None = None):
"""Exit safely when closing the window."""
def exit_program() -> NoReturn:
if self.update_auto_control:
self.update_auto_control.terminate()
self.capture_method.close(self)
- if a0 is not None:
- a0.accept()
+ if event is not None:
+ event.accept()
if self.is_auto_controlled:
# stop main thread (which is probably blocked reading input) via an interrupt signal
os.kill(os.getpid(), signal.SIGINT)
@@ -884,7 +876,7 @@ def exit_program() -> NoReturn:
# Simulates LiveSplit quitting without asking. See "TODO" at update_auto_control Worker
# This also more gracefully exits LiveSplit
# Users can still manually save their settings
- if a0 is None:
+ if event is None:
exit_program()
if user_profile.have_settings_changed(self):
@@ -905,11 +897,11 @@ def exit_program() -> NoReturn:
if user_profile.save_settings(self):
exit_program()
else:
- a0.ignore()
+ event.ignore()
if warning is QMessageBox.StandardButton.No:
exit_program()
if warning is QMessageBox.StandardButton.Cancel:
- a0.ignore()
+ event.ignore()
else:
exit_program()
diff --git a/src/error_messages.py b/src/error_messages.py
index 8eb6c9a0..63462140 100644
--- a/src/error_messages.py
+++ b/src/error_messages.py
@@ -8,7 +8,7 @@
from types import TracebackType
from typing import TYPE_CHECKING, NoReturn
-from PyQt6 import QtCore, QtWidgets
+from PySide6 import QtCore, QtWidgets
from utils import FROZEN, GITHUB_REPOSITORY
@@ -177,7 +177,7 @@ def excepthook(exception_type: type[BaseException], exception: BaseException, _t
# HACK: Can happen when starting the region selector while capturing with WindowsGraphicsCapture
if (
exception_type is SystemError
- and str(exception) == " returned a result with an error set"
+ and str(exception) == " returned a result with an error set"
):
return
# Whithin LiveSplit excepthook needs to use MainWindow's signals to show errors
diff --git a/src/hotkeys.py b/src/hotkeys.py
index e0fe3c65..b7c95632 100644
--- a/src/hotkeys.py
+++ b/src/hotkeys.py
@@ -5,7 +5,7 @@
import keyboard
import pyautogui
-from PyQt6 import QtWidgets
+from PySide6 import QtWidgets
import error_messages
from utils import fire_and_forget, is_digit
diff --git a/src/menu_bar.py b/src/menu_bar.py
index 774df935..7961a92a 100644
--- a/src/menu_bar.py
+++ b/src/menu_bar.py
@@ -6,7 +6,7 @@
import requests
from packaging.version import parse as version_parse
-from PyQt6 import QtCore, QtWidgets
+from PySide6 import QtCore, QtWidgets
from requests.exceptions import RequestException
import error_messages
@@ -18,7 +18,7 @@
change_capture_method,
get_all_video_capture_devices,
)
-from gen import about, design, resources_rc, settings as settings_ui, update_checker # noqa: F401
+from gen import about, design, settings as settings_ui, update_checker
from hotkeys import HOTKEYS, Hotkey, set_hotkey
from utils import (
AUTOSPLIT_VERSION,
@@ -113,7 +113,6 @@ def about_qt():
def about_qt_for_python():
webbrowser.open("https://wiki.qt.io/Qt_for_Python")
- webbrowser.open("https://www.riverbankcomputing.com/software/pyqt")
def check_for_updates(autosplit: AutoSplit, check_on_open: bool = False):
@@ -218,10 +217,7 @@ def __set_readme_link(self):
# HACK: This is a workaround because custom_image_settings_info_label
# simply will not open links with a left click no matter what we tried.
self.readme_link_button.clicked.connect(
- # PyQt6 typing is wrong
- lambda: webbrowser.open( # pyright: ignore[reportGeneralTypeIssues]
- f"https://github.com/{GITHUB_REPOSITORY}#readme",
- ),
+ lambda: webbrowser.open(f"https://github.com/{GITHUB_REPOSITORY}#readme"),
)
self.readme_link_button.setStyleSheet("border: 0px; background-color:rgba(0,0,0,0%);")
diff --git a/src/region_selection.py b/src/region_selection.py
index af369e4f..d0d73870 100644
--- a/src/region_selection.py
+++ b/src/region_selection.py
@@ -4,16 +4,16 @@
import ctypes.wintypes
import os
from math import ceil
-from typing import TYPE_CHECKING
+from typing import TYPE_CHECKING, cast
import cv2
import numpy as np
-from PyQt6 import QtCore, QtGui, QtWidgets
-from PyQt6.QtTest import QTest
+from PySide6 import QtCore, QtGui, QtWidgets
+from PySide6.QtTest import QTest
from typing_extensions import override
from win32 import win32gui
from win32con import SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN, SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN
-from winsdk._winrt import initialize_with_window
+from winsdk._winrt import initialize_with_window # pylint: disable=no-name-in-module
from winsdk.windows.foundation import AsyncStatus, IAsyncOperation
from winsdk.windows.graphics.capture import GraphicsCaptureItem, GraphicsCapturePicker
@@ -165,12 +165,15 @@ def align_region(autosplit: AutoSplit):
error_messages.region()
return
# This is the image used for aligning the capture region to the best fit for the user.
- template_filename = QtWidgets.QFileDialog.getOpenFileName(
- autosplit,
- "Select Reference Image",
- "",
- IMREAD_EXT_FILTER,
- )[0]
+ template_filename = cast(
+ str, # https://bugreports.qt.io/browse/PYSIDE-2285
+ QtWidgets.QFileDialog.getOpenFileName(
+ autosplit,
+ "Select Reference Image",
+ "",
+ IMREAD_EXT_FILTER,
+ )[0],
+ )
# Return if the user presses cancel
if not template_filename:
@@ -306,8 +309,8 @@ def __init__(self):
self.show()
@override
- def keyPressEvent(self, a0: QtGui.QKeyEvent):
- if a0.key() == QtCore.Qt.Key.Key_Escape:
+ def keyPressEvent(self, event: QtGui.QKeyEvent):
+ if event.key() == QtCore.Qt.Key.Key_Escape:
self.close()
@@ -315,9 +318,9 @@ class SelectWindowWidget(BaseSelectWidget):
"""Widget to select a window and obtain its bounds."""
@override
- def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):
- self._x = int(a0.position().x()) + self.geometry().x()
- self._y = int(a0.position().y()) + self.geometry().y()
+ def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
+ self._x = int(event.position().x()) + self.geometry().x()
+ self._y = int(event.position().y()) + self.geometry().y()
self.close()
@@ -345,7 +348,7 @@ def width(self):
return self._right - self._x
@override
- def paintEvent(self, a0: QtGui.QPaintEvent):
+ def paintEvent(self, event: QtGui.QPaintEvent):
if self.__begin != self.__end:
qpainter = QtGui.QPainter(self)
qpainter.setPen(QtGui.QPen(QtGui.QColor("red"), BORDER_WIDTH))
@@ -353,18 +356,18 @@ def paintEvent(self, a0: QtGui.QPaintEvent):
qpainter.drawRect(QtCore.QRect(self.__begin, self.__end))
@override
- def mousePressEvent(self, a0: QtGui.QMouseEvent):
- self.__begin = a0.position().toPoint()
+ def mousePressEvent(self, event: QtGui.QMouseEvent):
+ self.__begin = event.position().toPoint()
self.__end = self.__begin
self.update()
@override
- def mouseMoveEvent(self, a0: QtGui.QMouseEvent):
- self.__end = a0.position().toPoint()
+ def mouseMoveEvent(self, event: QtGui.QMouseEvent):
+ self.__end = event.position().toPoint()
self.update()
@override
- def mouseReleaseEvent(self, a0: QtGui.QMouseEvent):
+ def mouseReleaseEvent(self, event: QtGui.QMouseEvent):
if self.__begin != self.__end:
# The coordinates are pulled relative to the top left of the set geometry,
# so the added virtual screen offsets convert them back to the virtual screen coordinates
diff --git a/src/user_profile.py b/src/user_profile.py
index 9be788d6..cfa3ee96 100644
--- a/src/user_profile.py
+++ b/src/user_profile.py
@@ -4,7 +4,7 @@
from typing import TYPE_CHECKING, TypedDict, cast
import toml
-from PyQt6 import QtCore, QtWidgets
+from PySide6 import QtCore, QtWidgets
import error_messages
from capture_method import CAPTURE_METHODS, CaptureMethodEnum, Region, change_capture_method
@@ -77,13 +77,16 @@ def save_settings(autosplit: AutoSplit):
def save_settings_as(autosplit: AutoSplit):
"""@return: The save settings filepath selected. Empty if cancelled."""
# User picks save destination
- save_settings_file_path = QtWidgets.QFileDialog.getSaveFileName(
- autosplit,
- "Save Settings As",
- autosplit.last_successfully_loaded_settings_file_path
- or os.path.join(auto_split_directory, "settings.toml"),
- "TOML (*.toml)",
- )[0]
+ save_settings_file_path = cast(
+ str, # https://bugreports.qt.io/browse/PYSIDE-2285
+ QtWidgets.QFileDialog.getSaveFileName(
+ autosplit,
+ "Save Settings As",
+ autosplit.last_successfully_loaded_settings_file_path
+ or os.path.join(auto_split_directory, "settings.toml"),
+ "TOML (*.toml)",
+ )[0],
+ )
# If user cancels save destination window, don't save settings
if not save_settings_file_path:
@@ -152,12 +155,15 @@ def __load_settings_from_file(autosplit: AutoSplit, load_settings_file_path: str
def load_settings(autosplit: AutoSplit, from_path: str = ""):
- load_settings_file_path = from_path or QtWidgets.QFileDialog.getOpenFileName(
- autosplit,
- "Load Profile",
- os.path.join(auto_split_directory, "settings.toml"),
- "TOML (*.toml)",
- )[0]
+ load_settings_file_path = from_path or cast(
+ str, # https://bugreports.qt.io/browse/PYSIDE-2285
+ QtWidgets.QFileDialog.getOpenFileName(
+ autosplit,
+ "Load Profile",
+ os.path.join(auto_split_directory, "settings.toml"),
+ "TOML (*.toml)",
+ )[0],
+ )
if not (load_settings_file_path and __load_settings_from_file(autosplit, load_settings_file_path)):
return
@@ -196,7 +202,7 @@ def load_check_for_updates_on_open(autosplit: AutoSplit):
value = QtCore \
.QSettings("AutoSplit", "Check For Updates On Open") \
.value("check_for_updates_on_open", True, type=bool)
- autosplit.action_check_for_updates_on_open.setChecked(value)
+ autosplit.action_check_for_updates_on_open.setChecked(value) # pyright: ignore[reportGeneralTypeIssues] # Type not infered by PySide6 # noqa: E501 # pylint: disable=line-too-long
def set_check_for_updates_on_open(design_window: design.Ui_MainWindow, value: bool):
diff --git a/typings/PyQt6/QtTest.pyi b/typings/PyQt6/QtTest.pyi
deleted file mode 100644
index 83a6c435..00000000
--- a/typings/PyQt6/QtTest.pyi
+++ /dev/null
@@ -1,13 +0,0 @@
-import typing
-
-import PyQt6.sip
-
-# Email sent to pyqt@riverbankcomputing.com
-
-
-class QTest(PyQt6.sip.simplewrapper):
- @typing.overload
- @staticmethod
- def qWait(ms: int) -> None: ...
- @typing.overload
- def qWait(self, ms: int) -> None: ...