diff --git a/_pydev_bundle/pydev_monkey_qt.py b/_pydev_bundle/pydev_monkey_qt.py index e348b842..3305d538 100644 --- a/_pydev_bundle/pydev_monkey_qt.py +++ b/_pydev_bundle/pydev_monkey_qt.py @@ -18,7 +18,7 @@ def set_trace_in_qt(): def patch_qt(qt_support_mode): ''' - This method patches qt (PySide2, PySide, PyQt4, PyQt5) so that we have hooks to set the tracing for QThread. + This method patches qt (PySide6, PySide2, PySide, PyQt4, PyQt5, PyQt6) so that we have hooks to set the tracing for QThread. ''' if not qt_support_mode: return @@ -43,24 +43,38 @@ def patch_qt(qt_support_mode): patch_qt_on_import = None try: - import PySide2 # @UnresolvedImport @UnusedImport - qt_support_mode = 'pyside2' + import PySide6 # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyside6' except: try: - import Pyside # @UnresolvedImport @UnusedImport - qt_support_mode = 'pyside' + import PySide2 # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyside2' except: try: - import PyQt5 # @UnresolvedImport @UnusedImport - qt_support_mode = 'pyqt5' + import Pyside # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyside' except: try: - import PyQt4 # @UnresolvedImport @UnusedImport - qt_support_mode = 'pyqt4' + import PyQt6 # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyqt6' except: - return + try: + import PyQt5 # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyqt5' + except: + try: + import PyQt4 # @UnresolvedImport @UnusedImport + qt_support_mode = 'pyqt4' + except: + return + if qt_support_mode == 'pyside6': + try: + import PySide6.QtCore # @UnresolvedImport + _internal_patch_qt(PySide6.QtCore, qt_support_mode) + except: + return - if qt_support_mode == 'pyside2': + elif qt_support_mode == 'pyside2': try: import PySide2.QtCore # @UnresolvedImport _internal_patch_qt(PySide2.QtCore, qt_support_mode) @@ -73,6 +87,13 @@ def patch_qt(qt_support_mode): _internal_patch_qt(PySide.QtCore, qt_support_mode) except: return + + elif qt_support_mode == 'pyqt6': + try: + import PyQt6.QtCore # @UnresolvedImport + _internal_patch_qt(PyQt6.QtCore) + except: + return elif qt_support_mode == 'pyqt5': try: @@ -155,14 +176,14 @@ def __init__(self, thread, original_started): QtCore.QObject.__init__(self) self.thread = thread self.original_started = original_started - if qt_support_mode in ('pyside', 'pyside2'): + if qt_support_mode in ('pyside', 'pyside2', 'pyside6'): self._signal = original_started else: self._signal.connect(self._on_call) self.original_started.connect(self._signal) def connect(self, func, *args, **kwargs): - if qt_support_mode in ('pyside', 'pyside2'): + if qt_support_mode in ('pyside', 'pyside2', 'pyside6'): return self._signal.connect(FuncWrapper(func), *args, **kwargs) else: return self._signal.connect(func, *args, **kwargs) @@ -193,7 +214,11 @@ def __init__(self, *args, **kwargs): def _exec_run(self): set_trace_in_qt() - self.exec_() + # Qt6: exec_ is deprecated/removed + if hasattr(self, 'exec'): + self.exec() + else: + self.exec_() return None def _new_run(self): diff --git a/_pydevd_bundle/pydevd_command_line_handling.py b/_pydevd_bundle/pydevd_command_line_handling.py index 1759ec7a..0a725283 100644 --- a/_pydevd_bundle/pydevd_command_line_handling.py +++ b/_pydevd_bundle/pydevd_command_line_handling.py @@ -151,13 +151,13 @@ def process_command_line(argv): # The --qt-support is special because we want to keep backward compatibility: # Previously, just passing '--qt-support' meant that we should use the auto-discovery mode # whereas now, if --qt-support is passed, it should be passed as --qt-support=, where - # mode can be one of 'auto', 'none', 'pyqt5', 'pyqt4', 'pyside', 'pyside2'. + # mode can be one of 'auto', 'none', 'pyqt6', 'pyqt5', 'pyqt4', 'pyside', 'pyside2', 'pyside6'. if argv[i] == '--qt-support': setup['qt-support'] = 'auto' elif argv[i].startswith('--qt-support='): qt_support = argv[i][len('--qt-support='):] - valid_modes = ('none', 'auto', 'pyqt5', 'pyqt4', 'pyside', 'pyside2') + valid_modes = ('none', 'auto', 'pyqt6', 'pyqt5', 'pyqt4', 'pyside', 'pyside2', 'pyside6') if qt_support not in valid_modes: raise ValueError("qt-support mode invalid: " + qt_support) if qt_support == 'none': diff --git a/tests_python/resources/_debugger_case_qthread1.py b/tests_python/resources/_debugger_case_qthread1.py index b77a45b5..1c1bf54c 100644 --- a/tests_python/resources/_debugger_case_qthread1.py +++ b/tests_python/resources/_debugger_case_qthread1.py @@ -5,12 +5,18 @@ try: from PySide import QtCore # @UnresolvedImport except: - from PySide2 import QtCore # @UnresolvedImport + try: + from PySide2 import QtCore # @UnresolvedImport + except: + from PySide6 import QtCore # @UnresolvedImport except: try: - from PyQt4 import QtCore + from PyQt4 import QtCore # @UnresolvedImport except: - from PyQt5 import QtCore + try: + from PyQt5 import QtCore # @UnresolvedImport + except: + from PyQt6 import QtCore # @UnresolvedImport # Subclassing QThread # http://doc.qt.nokia.com/latest/qthread.html @@ -27,5 +33,9 @@ def run(self): thread = AThread() thread.finished.connect(app.exit) thread.start() -app.exec_() +# Qt6: exec_ is deprecated/removed +if hasattr(app, 'exec'): + app.exec() +else: + app.exec_() print('TEST SUCEEDED!') diff --git a/tests_python/resources/_debugger_case_qthread2.py b/tests_python/resources/_debugger_case_qthread2.py index feddd72c..ee544f77 100644 --- a/tests_python/resources/_debugger_case_qthread2.py +++ b/tests_python/resources/_debugger_case_qthread2.py @@ -5,12 +5,18 @@ try: from PySide import QtCore # @UnresolvedImport except: - from PySide2 import QtCore # @UnresolvedImport + try: + from PySide2 import QtCore # @UnresolvedImport + except: + from PySide6 import QtCore # @UnresolvedImport except: try: - from PyQt4 import QtCore + from PyQt4 import QtCore # @UnresolvedImport except: - from PyQt5 import QtCore + try: + from PyQt5 import QtCore # @UnresolvedImport + except: + from PyQt6 import QtCore # @UnresolvedImport # Subclassing QObject and using moveToThread # http://labs.qt.nokia.com/2007/07/05/qthreads-no-longer-abstract/ @@ -36,5 +42,9 @@ def long_running(self): objThread.started.connect(obj.long_running) objThread.finished.connect(app.exit) objThread.start() -app.exec_() +# Qt6: exec_ is deprecated/removed +if hasattr(app, 'exec'): + app.exec() +else: + app.exec_() print('TEST SUCEEDED!') diff --git a/tests_python/resources/_debugger_case_qthread3.py b/tests_python/resources/_debugger_case_qthread3.py index 5bc0470d..d610b52b 100644 --- a/tests_python/resources/_debugger_case_qthread3.py +++ b/tests_python/resources/_debugger_case_qthread3.py @@ -5,12 +5,18 @@ try: from PySide import QtCore # @UnresolvedImport except: - from PySide2 import QtCore # @UnresolvedImport + try: + from PySide2 import QtCore # @UnresolvedImport + except: + from PySide6 import QtCore # @UnresolvedImport except: try: - from PyQt4 import QtCore + from PyQt4 import QtCore # @UnresolvedImport except: - from PyQt5 import QtCore + try: + from PyQt5 import QtCore # @UnresolvedImport + except: + from PyQt6 import QtCore # @UnresolvedImport # Using a QRunnable # http://doc.qt.nokia.com/latest/qthreadpool.html @@ -30,6 +36,10 @@ def run(self): app = QtCore.QCoreApplication([]) runnable = Runnable() QtCore.QThreadPool.globalInstance().start(runnable) -app.exec_() +# Qt6: exec_ is deprecated/removed +if hasattr(app, 'exec'): + app.exec() +else: + app.exec_() QtCore.QThreadPool.globalInstance().waitForDone() print('TEST SUCEEDED!') diff --git a/tests_python/resources/_debugger_case_qthread4.py b/tests_python/resources/_debugger_case_qthread4.py index c137f05d..4bfb6156 100644 --- a/tests_python/resources/_debugger_case_qthread4.py +++ b/tests_python/resources/_debugger_case_qthread4.py @@ -1,13 +1,19 @@ try: - from PySide import QtCore + try: + from PySide import QtCore # @UnresolvedImport + except: + try: + from PySide2 import QtCore # @UnresolvedImport + except: + from PySide6 import QtCore # @UnresolvedImport except: try: - from PySide2 import QtCore + from PyQt4 import QtCore # @UnresolvedImport except: try: - from PyQt4 import QtCore + from PyQt5 import QtCore # @UnresolvedImport except: - from PyQt5 import QtCore + from PyQt6 import QtCore # @UnresolvedImport class TestObject(QtCore.QObject): @@ -30,7 +36,7 @@ def run(self): def on_start(): print('On start called1') - print('On start called2') + print('On start called2') # break here app = QtCore.QCoreApplication([]) @@ -43,5 +49,9 @@ def on_start(): some_thread.finished.connect(app.quit) some_thread.start() -app.exec_() +# Qt6: exec_ is deprecated/removed +if hasattr(app, 'exec'): + app.exec() +else: + app.exec_() print('TEST SUCEEDED!') diff --git a/tests_python/test_debugger.py b/tests_python/test_debugger.py index 3f6a8648..65d729a4 100644 --- a/tests_python/test_debugger.py +++ b/tests_python/test_debugger.py @@ -1163,8 +1163,12 @@ def _has_qt(): from PySide import QtCore # @UnresolvedImport return True except: - from PySide2 import QtCore # @UnresolvedImport - return True + try: + from PySide2 import QtCore # @UnresolvedImport + return True + except: + from PySide6 import QtCore # @UnresolvedImport + return True except: try: from PyQt4 import QtCore # @UnresolvedImport @@ -1174,7 +1178,11 @@ def _has_qt(): from PyQt5 import QtCore # @UnresolvedImport return True except: - pass + try: + from PyQt6 import QtCore # @UnresolvedImport + return True + except: + pass return False @@ -1249,7 +1257,7 @@ def additional_output_checks(stdout, stderr): if 'native Qt signal is not callable' in stderr: raise AssertionError('Did not expect "native Qt signal is not callable" to be in stderr:\n%s' % (stderr,)) - breakpoint_id = writer.write_add_breakpoint(28, 'on_start') # breakpoint on print('On start called2'). + breakpoint_id = writer.write_add_breakpoint(writer.get_line_index_with_content('break here'), 'on_start') # breakpoint on print('On start called2'). writer.write_make_initial_run() hit = writer.wait_for_breakpoint_hit()