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: ...