# ----------------------------------------------------------------------------- # Copyright © 2014-2015 Colin Duquesnoy # Copyright © 2009- The Spyder Development Team # # Licensed under the terms of the MIT License # (see LICENSE.txt for details) # ----------------------------------------------------------------------------- """Provides QtGui classes and functions.""" from . import PYQT6, PYQT5, PYSIDE2, PYSIDE6 if PYQT5: from PyQt5.QtGui import * elif PYQT6: from PyQt6 import QtGui from PyQt6.QtGui import * from PyQt6.QtOpenGL import * QFontMetrics.width = lambda self, *args, **kwargs: self.horizontalAdvance(*args, **kwargs) QFontMetricsF.width = lambda self, *args, **kwargs: self.horizontalAdvance(*args, **kwargs) # Map missing/renamed methods QDrag.exec_ = lambda self, *args, **kwargs: self.exec(*args, **kwargs) QGuiApplication.exec_ = QGuiApplication.exec QTextDocument.print_ = lambda self, *args, **kwargs: self.print(*args, **kwargs) # Allow unscoped access for enums inside the QtGui module from .enums_compat import promote_enums promote_enums(QtGui) del QtGui elif PYSIDE2: from PySide2.QtGui import * if hasattr(QFontMetrics, 'horizontalAdvance'): # Needed to prevent raising a DeprecationWarning when using QFontMetrics.width QFontMetrics.width = lambda self, *args, **kwargs: self.horizontalAdvance(*args, **kwargs) elif PYSIDE6: from PySide6.QtGui import * from PySide6.QtOpenGL import * QFontMetrics.width = lambda self, *args, **kwargs: self.horizontalAdvance(*args, **kwargs) QFontMetricsF.width = lambda self, *args, **kwargs: self.horizontalAdvance(*args, **kwargs) # Map DeprecationWarning methods QDrag.exec_ = lambda self, *args, **kwargs: self.exec(*args, **kwargs) QGuiApplication.exec_ = QGuiApplication.exec if PYSIDE2 or PYSIDE6: # PySide{2,6} do not accept the `mode` keyword argument in # QTextCursor.movePosition() even though it is a valid optional argument # as per C++ API. Fix this by monkeypatching. # # Notes: # # * The `mode` argument is called `arg__2` in PySide{2,6} as per # QTextCursor.movePosition.__doc__ and __signature__. Using `arg__2` as # keyword argument works as intended, so does using a positional # argument. Tested with PySide2 5.15.0, 5.15.2.1 and 5.15.3 and PySide6 # 6.3.0; older version, down to PySide 1, are probably affected as well [1]. # # * PySide2 5.15.0 and 5.15.2.1 silently ignore invalid keyword arguments, # i.e. passing the `mode` keyword argument has no effect and doesn’t # raise an exception. Older versions, down to PySide 1, are probably # affected as well [1]. At least PySide2 5.15.3 and PySide6 6.3.0 raise an # exception when `mode` or any other invalid keyword argument is passed. # # [1] https://bugreports.qt.io/browse/PYSIDE-185 movePosition = QTextCursor.movePosition def movePositionPatched( self, operation: QTextCursor.MoveOperation, mode: QTextCursor.MoveMode = QTextCursor.MoveAnchor, n: int = 1, ) -> bool: return movePosition(self, operation, mode, n) QTextCursor.movePosition = movePositionPatched