Add patch for NodeGraphQt PySide6 6.7+ compatibility

The setSelectionArea() API changed in PySide6 6.7 - it now requires
an ItemSelectionOperation parameter before ItemSelectionMode.

Files added:
- patches/nodegraphqt_pyside6_compat.patch: Git-style patch file
- patches/UPSTREAM_ISSUE.md: Issue report for upstream project
- scripts/patch_nodegraphqt.py: Script to auto-apply the patch

The patch fixes rubber band selection errors when dragging in the
node graph viewer. Run after pip install:

    python scripts/patch_nodegraphqt.py

Co-Authored-By: Claude Opus 4.5 <[email protected]>
This commit is contained in:
rob
2026-01-15 19:10:10 -04:00
co-authored by Claude Opus 4.5
parent 042be8b49b
commit ad9a59283c
3 changed files with 196 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
# PySide6 6.7+ Compatibility Issue: setSelectionArea API Change
## Issue
When using NodeGraphQt-QuiltiX-fork with PySide6 6.7+, dragging a rubber band selection in the node graph causes repeated TypeError exceptions:
```
TypeError: 'PySide6.QtWidgets.QGraphicsScene.setSelectionArea' called with wrong argument types:
PySide6.QtWidgets.QGraphicsScene.setSelectionArea(QPainterPath, ItemSelectionMode)
Supported signatures:
PySide6.QtWidgets.QGraphicsScene.setSelectionArea(PySide6.QtGui.QPainterPath, PySide6.QtGui.QTransform)
PySide6.QtWidgets.QGraphicsScene.setSelectionArea(PySide6.QtGui.QPainterPath, PySide6.QtCore.Qt.ItemSelectionOperation = Instance(Qt.ReplaceSelection), PySide6.QtCore.Qt.ItemSelectionMode = Instance(Qt.IntersectsItemShape), PySide6.QtGui.QTransform = Default(QTransform))
```
## Root Cause
The `QGraphicsScene.setSelectionArea()` method signature changed in PySide6 6.7. The old signature allowed:
```python
setSelectionArea(path, mode) # mode = Qt.ItemSelectionMode
```
The new signature requires:
```python
setSelectionArea(path, operation, mode) # operation = Qt.ItemSelectionOperation
```
## Affected File
`NodeGraphQt/widgets/viewer.py` line 524-526
## Current Code
```python
self.scene().setSelectionArea(
path, QtCore.Qt.IntersectsItemShape
)
```
## Fix
```python
self.scene().setSelectionArea(
path, QtCore.Qt.ReplaceSelection,
QtCore.Qt.IntersectsItemShape
)
```
## Environment
- Python: 3.12
- PySide6: 6.6.3.1 (installed by NodeGraphQt-QuiltiX-fork, but issue affects 6.7+)
- NodeGraphQt-QuiltiX-fork: 0.7.0
## Workaround
Apply this patch after installation:
```python
# In viewer.py, change line 524-526 from:
self.scene().setSelectionArea(
path, QtCore.Qt.IntersectsItemShape
)
# To:
self.scene().setSelectionArea(
path, QtCore.Qt.ReplaceSelection,
QtCore.Qt.IntersectsItemShape
)
```
## Related
This issue may also exist in:
- Original NodeGraphQt
- OdenGraphQt
- Other forks
The fix is backward compatible with older PySide6 versions that support the 3-argument signature.
+13
View File
@@ -0,0 +1,13 @@
--- a/NodeGraphQt/widgets/viewer.py
+++ b/NodeGraphQt/widgets/viewer.py
@@ -521,8 +521,10 @@ class NodeViewer(QtWidgets.QGraphicsView):
path = QtGui.QPainterPath()
path.addRect(map_rect)
self._rubber_band.setGeometry(rect)
+ # PySide6 6.7+ requires ItemSelectionOperation parameter
self.scene().setSelectionArea(
- path, QtCore.Qt.IntersectsItemShape
+ path, QtCore.Qt.ReplaceSelection,
+ QtCore.Qt.IntersectsItemShape
)
self.scene().update(map_rect)