From 408f586ea1492cd97239fb9041c17041468e9278 Mon Sep 17 00:00:00 2001 From: James Horsley Date: Thu, 3 Jul 2025 17:15:55 +0100 Subject: [PATCH 1/2] Add misc tests --- tests/qlayout.py | 16 +++++++++++++++- tests/qpixmap.py | 7 ++++++- tests/qregularexpressionvalidator.py | 10 ++++++++++ tests/qtreewidget.py | 3 +++ 4 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 tests/qregularexpressionvalidator.py diff --git a/tests/qlayout.py b/tests/qlayout.py index 44732f4..31434e6 100644 --- a/tests/qlayout.py +++ b/tests/qlayout.py @@ -1,5 +1,19 @@ -from PySide6.QtWidgets import QGridLayout, QHBoxLayout, QVBoxLayout, QLayout +from typing_extensions import override +from PySide6.QtWidgets import QGridLayout, QHBoxLayout, QVBoxLayout, QLayout, QLayoutItem a = QGridLayout(parent=None) b = QHBoxLayout(parent=None) c = QVBoxLayout(parent=None) + +class TestLayout(QLayout): + # These can return None + @override + def itemAt(self, index: int) -> 'QLayoutItem | None': + return super().itemAt(index) + + @override + def takeAt(self, index: int) -> 'QLayoutItem | None': + return super().takeAt(index) + +assert a.itemAt(0) is None +assert a.takeAt(0) is None diff --git a/tests/qpixmap.py b/tests/qpixmap.py index ded08e2..291abdb 100644 --- a/tests/qpixmap.py +++ b/tests/qpixmap.py @@ -1,7 +1,12 @@ -from PySide6.QtCore import Qt +from PySide6.QtCore import QByteArray, Qt from PySide6.QtGui import QPixmap emptyPixmap = QPixmap(16, 16) emptyPixmap.fill(Qt.GlobalColor.transparent) emptyPixmap.fill('white') emptyPixmap.fill(0xFFFFFF) + +# Should accept str for format +worlds_smallest_png = QByteArray.fromBase64(b"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQAAAAA3bvkkAAAACklEQVR4AWNgAAAAAgABc3UBGAAAAABJRU5ErkJggg==") +load_pixmap = QPixmap() +load_pixmap.loadFromData(worlds_smallest_png, "PNG") diff --git a/tests/qregularexpressionvalidator.py b/tests/qregularexpressionvalidator.py new file mode 100644 index 0000000..a8669b1 --- /dev/null +++ b/tests/qregularexpressionvalidator.py @@ -0,0 +1,10 @@ +from PySide6.QtGui import QRegularExpressionValidator, QValidator + + +v = QRegularExpressionValidator() + +valid_info: tuple[QValidator.State, str, int] = v.validate("", 0) +assert isinstance(valid_info, tuple) +assert isinstance(valid_info[0], QValidator.State) +assert isinstance(valid_info[1], str) +assert isinstance(valid_info[2], int) diff --git a/tests/qtreewidget.py b/tests/qtreewidget.py index 8a56710..569f066 100644 --- a/tests/qtreewidget.py +++ b/tests/qtreewidget.py @@ -13,3 +13,6 @@ # default type returned by topLevelItem() should allow None value topItem = None +t.setCurrentItem(None) +current_item = t.currentItem() +current_item = None From 1d4a508d541ddf3cdfd2936c20c44dd6bc0dd29e Mon Sep 17 00:00:00 2001 From: James Horsley Date: Thu, 3 Jul 2025 18:46:17 +0100 Subject: [PATCH 2/2] Fixes for added misc tests --- PySide6-stubs/QtGui.pyi | 6 +++--- PySide6-stubs/QtWidgets.pyi | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/PySide6-stubs/QtGui.pyi b/PySide6-stubs/QtGui.pyi index 91654b1..d2dba29 100644 --- a/PySide6-stubs/QtGui.pyi +++ b/PySide6-stubs/QtGui.pyi @@ -6112,9 +6112,9 @@ class QPixmap(PySide6.QtGui.QPaintDevice): def isQBitmap(self) -> bool: ... def load(self, fileName: str, format: Union[bytes, bytearray, memoryview, NoneType] = ..., flags: PySide6.QtCore.Qt.ImageConversionFlag = ...) -> bool: ... @overload - def loadFromData(self, buf: Union[bytes, bytearray, memoryview], format: Union[bytes, bytearray, memoryview, NoneType] = ..., flags: PySide6.QtCore.Qt.ImageConversionFlag = ...) -> bool: ... + def loadFromData(self, buf: Union[bytes, bytearray, memoryview], format: Union[bytes, bytearray, memoryview, str, NoneType] = ..., flags: PySide6.QtCore.Qt.ImageConversionFlag = ...) -> bool: ... @overload - def loadFromData(self, data: Union[PySide6.QtCore.QByteArray, bytes, bytearray, memoryview], format: Union[bytes, bytearray, memoryview, NoneType] = ..., flags: PySide6.QtCore.Qt.ImageConversionFlag = ...) -> bool: ... + def loadFromData(self, data: Union[PySide6.QtCore.QByteArray, bytes, bytearray, memoryview], format: Union[bytes, bytearray, memoryview, str, NoneType] = ..., flags: PySide6.QtCore.Qt.ImageConversionFlag = ...) -> bool: ... def mask(self) -> PySide6.QtGui.QBitmap: ... def metric(self, arg__1: PySide6.QtGui.QPaintDevice.PaintDeviceMetric) -> int: ... def paintEngine(self) -> PySide6.QtGui.QPaintEngine: ... @@ -6796,7 +6796,7 @@ class QRegularExpressionValidator(PySide6.QtGui.QValidator): def regularExpression(self) -> PySide6.QtCore.QRegularExpression: ... def setRegularExpression(self, re: Union[PySide6.QtCore.QRegularExpression, str]) -> None: ... - def validate(self, input: str, pos: int) -> object: ... + def validate(self, input: str, pos: int) -> tuple[PySide6.QtGui.QValidator.State, str, int]: ... class QResizeEvent(PySide6.QtCore.QEvent): diff --git a/PySide6-stubs/QtWidgets.pyi b/PySide6-stubs/QtWidgets.pyi index 6ca931f..3603b55 100644 --- a/PySide6-stubs/QtWidgets.pyi +++ b/PySide6-stubs/QtWidgets.pyi @@ -4349,7 +4349,7 @@ class QLayout(PySide6.QtCore.QObject, PySide6.QtWidgets.QLayoutItem): def invalidate(self) -> None: ... def isEmpty(self) -> bool: ... def isEnabled(self) -> bool: ... - def itemAt(self, index: int) -> PySide6.QtWidgets.QLayoutItem: ... + def itemAt(self, index: int) -> Optional[PySide6.QtWidgets.QLayoutItem]: ... def layout(self) -> PySide6.QtWidgets.QLayout: ... def maximumSize(self) -> PySide6.QtCore.QSize: ... def menuBar(self) -> PySide6.QtWidgets.QWidget: ... @@ -4375,7 +4375,7 @@ class QLayout(PySide6.QtCore.QObject, PySide6.QtWidgets.QLayoutItem): def setSpacing(self, arg__1: int) -> None: ... def sizeConstraint(self) -> PySide6.QtWidgets.QLayout.SizeConstraint: ... def spacing(self) -> int: ... - def takeAt(self, index: int) -> PySide6.QtWidgets.QLayoutItem: ... + def takeAt(self, index: int) -> Optional[PySide6.QtWidgets.QLayoutItem]: ... def totalHeightForWidth(self, w: int) -> int: ... def totalMaximumSize(self) -> PySide6.QtCore.QSize: ... def totalMinimumHeightForWidth(self, w: int) -> int: ... @@ -4718,9 +4718,9 @@ class QListWidget(PySide6.QtWidgets.QListView): def scrollToItem(self, item: PySide6.QtWidgets.QListWidgetItem, hint: PySide6.QtWidgets.QAbstractItemView.ScrollHint = ...) -> None: ... def selectedItems(self) -> List[PySide6.QtWidgets.QListWidgetItem]: ... @overload - def setCurrentItem(self, item: PySide6.QtWidgets.QListWidgetItem) -> None: ... + def setCurrentItem(self, item: Optional[PySide6.QtWidgets.QListWidgetItem]) -> None: ... @overload - def setCurrentItem(self, item: PySide6.QtWidgets.QListWidgetItem, command: PySide6.QtCore.QItemSelectionModel.SelectionFlag) -> None: ... + def setCurrentItem(self, item: Optional[PySide6.QtWidgets.QListWidgetItem], command: PySide6.QtCore.QItemSelectionModel.SelectionFlag) -> None: ... @overload def setCurrentRow(self, row: int) -> None: ... @overload @@ -8940,7 +8940,7 @@ class QTreeWidget(PySide6.QtWidgets.QTreeView): def collapseItem(self, item: PySide6.QtWidgets.QTreeWidgetItem) -> None: ... def columnCount(self) -> int: ... def currentColumn(self) -> int: ... - def currentItem(self) -> PySide6.QtWidgets.QTreeWidgetItem: ... + def currentItem(self) -> Optional[PySide6.QtWidgets.QTreeWidgetItem]: ... def dropEvent(self, event: PySide6.QtGui.QDropEvent) -> None: ... def dropMimeData(self, parent: PySide6.QtWidgets.QTreeWidgetItem, index: int, data: PySide6.QtCore.QMimeData, action: PySide6.QtCore.Qt.DropAction) -> bool: ... def editItem(self, item: PySide6.QtWidgets.QTreeWidgetItem, column: int = ...) -> None: ... @@ -8970,9 +8970,9 @@ class QTreeWidget(PySide6.QtWidgets.QTreeView): def selectedItems(self) -> List[PySide6.QtWidgets.QTreeWidgetItem]: ... def setColumnCount(self, columns: int) -> None: ... @overload - def setCurrentItem(self, item: PySide6.QtWidgets.QTreeWidgetItem) -> None: ... + def setCurrentItem(self, item: Optional[PySide6.QtWidgets.QTreeWidgetItem]) -> None: ... @overload - def setCurrentItem(self, item: PySide6.QtWidgets.QTreeWidgetItem, column: int) -> None: ... + def setCurrentItem(self, item: Optional[PySide6.QtWidgets.QTreeWidgetItem], column: int) -> None: ... @overload def setCurrentItem(self, item: PySide6.QtWidgets.QTreeWidgetItem, column: int, command: PySide6.QtCore.QItemSelectionModel.SelectionFlag) -> None: ... def setHeaderItem(self, item: PySide6.QtWidgets.QTreeWidgetItem) -> None: ... @@ -9048,7 +9048,7 @@ class QTreeWidgetItem(Shiboken.Object): def isFirstColumnSpanned(self) -> bool: ... def isHidden(self) -> bool: ... def isSelected(self) -> bool: ... - def parent(self) -> PySide6.QtWidgets.QTreeWidgetItem: ... + def parent(self) -> Optional[PySide6.QtWidgets.QTreeWidgetItem]: ... def read(self, in_: PySide6.QtCore.QDataStream) -> None: ... def removeChild(self, child: PySide6.QtWidgets.QTreeWidgetItem) -> None: ... def setBackground(self, column: int, brush: Union[PySide6.QtGui.QBrush, PySide6.QtCore.Qt.BrushStyle, PySide6.QtCore.Qt.GlobalColor, PySide6.QtGui.QColor, PySide6.QtGui.QGradient, PySide6.QtGui.QImage, PySide6.QtGui.QPixmap]) -> None: ...