Skip to content

Commit 8b01034

Browse files
BHARATH0153BHARATH0153
authored andcommitted
fix: use Qt flag_val() for PySide6 compat in IDA plugin
Replace direct bitwise operations on module-level Qt flag constants with flag_val() helper that extracts int values from enum members. This resolves RuntimeWarning in IDA 9.3+ where PyQt5 shim is deprecated. Changes: - qt_compat.py: add flag_val(), fix qt_get_item_flag_tristate() to return int value using proper enum path - item.py: use flag_val() for all flag bitwise operations - view.py: use flag_val() for all flag bitwise operations
1 parent adffa80 commit 8b01034

3 files changed

Lines changed: 19 additions & 39 deletions

File tree

capa/ida/plugin/item.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121

2222
import capa.ida.helpers
2323
from capa.features.address import Address, FileOffsetAddress, AbsoluteVirtualAddress
24-
from capa.ida.plugin.qt_compat import QtCore, qt_get_item_flag_tristate
24+
from capa.ida.plugin.qt_compat import QtCore, qt_get_item_flag_tristate, flag_val
2525

2626

2727
def info_to_name(display):
@@ -52,23 +52,19 @@ def __init__(self, parent: Optional["CapaExplorerDataItem"], data: list[str], ca
5252
self._can_check = can_check
5353

5454
# default state for item
55-
self.flags = QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
55+
self.flags = flag_val(QtCore.Qt.ItemIsEnabled) | flag_val(QtCore.Qt.ItemIsSelectable)
5656

5757
if self._can_check:
58-
self.flags = self.flags | QtCore.Qt.ItemIsUserCheckable | qt_get_item_flag_tristate()
58+
self.flags = self.flags | flag_val(QtCore.Qt.ItemIsUserCheckable) | qt_get_item_flag_tristate()
5959

6060
if self.pred:
6161
self.pred.appendChild(self)
6262

6363
def setIsEditable(self, isEditable=False):
64-
"""modify item editable flags
65-
66-
@param isEditable: True, can edit, False cannot edit
67-
"""
6864
if isEditable:
69-
self.flags |= QtCore.Qt.ItemIsEditable
65+
self.flags |= flag_val(QtCore.Qt.ItemIsEditable)
7066
else:
71-
self.flags &= ~QtCore.Qt.ItemIsEditable
67+
self.flags &= ~flag_val(QtCore.Qt.ItemIsEditable)
7268

7369
def setChecked(self, checked):
7470
"""set item as checked

capa/ida/plugin/qt_compat.py

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -41,39 +41,24 @@
4141
Qt = QtCore.Qt
4242

4343

44-
def qt_get_item_flag_tristate():
45-
"""
46-
Get the tristate item flag compatible with Qt5 and Qt6.
47-
48-
Qt5 (PyQt5): Uses Qt.ItemIsTristate
49-
Qt6 (PySide6): Qt.ItemIsTristate was removed, uses Qt.ItemIsAutoTristate
44+
def flag_val(flag):
45+
if hasattr(flag, 'value'):
46+
return flag.value
47+
return flag
5048

51-
ItemIsAutoTristate automatically manages tristate based on child checkboxes,
52-
matching the original ItemIsTristate behavior where parent checkboxes reflect
53-
the check state of their children.
5449

55-
Returns:
56-
int: The appropriate flag value for the Qt version
57-
58-
Raises:
59-
AttributeError: If the tristate flag cannot be found in the Qt library
60-
"""
50+
def qt_get_item_flag_tristate():
6151
if QT_LIBRARY == "PySide6":
62-
# Qt6: ItemIsTristate was removed, replaced with ItemIsAutoTristate
63-
# Try different possible locations (API varies slightly across PySide6 versions)
64-
if hasattr(Qt, "ItemIsAutoTristate"):
65-
return Qt.ItemIsAutoTristate
66-
elif hasattr(Qt, "ItemFlag") and hasattr(Qt.ItemFlag, "ItemIsAutoTristate"):
67-
return Qt.ItemFlag.ItemIsAutoTristate
52+
if hasattr(Qt, "ItemFlag") and hasattr(Qt.ItemFlag, "ItemIsAutoTristate"):
53+
return Qt.ItemFlag.ItemIsAutoTristate.value
6854
else:
6955
raise AttributeError(
7056
"Cannot find ItemIsAutoTristate in PySide6. "
7157
+ "Your PySide6 version may be incompatible with capa. "
7258
+ f"Available Qt attributes: {[attr for attr in dir(Qt) if 'Item' in attr]}"
7359
)
7460
else:
75-
# Qt5: Use the original ItemIsTristate flag
7661
return Qt.ItemIsTristate
7762

7863

79-
__all__ = ["qt_get_item_flag_tristate", "Signal", "QAction", "QtGui", "QtCore", "QtWidgets"]
64+
__all__ = ["flag_val", "qt_get_item_flag_tristate", "Signal", "QAction", "QtGui", "QtCore", "QtWidgets"]

capa/ida/plugin/view.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from capa.ida.plugin.item import CapaExplorerFunctionItem
2727
from capa.features.address import FileOffsetAddress, AbsoluteVirtualAddress, _NoAddress
2828
from capa.ida.plugin.model import CapaExplorerDataModel
29-
from capa.ida.plugin.qt_compat import QtGui, QtCore, Signal, QAction, QtWidgets
29+
from capa.ida.plugin.qt_compat import QtGui, QtCore, Signal, QAction, QtWidgets, flag_val
3030

3131
MAX_SECTION_SIZE = 750
3232

@@ -484,9 +484,9 @@ def slot_item_double_clicked(self, o, column):
484484
CapaExplorerRulegenEditor.get_column_comment_index(),
485485
CapaExplorerRulegenEditor.get_column_description_index(),
486486
):
487-
o.setFlags(o.flags() | QtCore.Qt.ItemIsEditable)
487+
o.setFlags(int(o.flags()) | flag_val(QtCore.Qt.ItemIsEditable))
488488
self.editItem(o, column)
489-
o.setFlags(o.flags() & ~QtCore.Qt.ItemIsEditable)
489+
o.setFlags(int(o.flags()) & ~flag_val(QtCore.Qt.ItemIsEditable))
490490
self.is_editing = True
491491

492492
def update_preview(self):
@@ -601,13 +601,12 @@ def set_expression_node(self, o):
601601
def set_feature_node(self, o):
602602
""" """
603603
setattr(o, "capa_type", CapaExplorerRulegenEditor.get_node_type_feature())
604-
o.setFlags(o.flags() & ~QtCore.Qt.ItemIsDropEnabled)
604+
o.setFlags(int(o.flags()) & ~flag_val(QtCore.Qt.ItemIsDropEnabled))
605605
self.style_feature_node(o)
606606

607607
def set_comment_node(self, o):
608-
""" """
609608
setattr(o, "capa_type", CapaExplorerRulegenEditor.get_node_type_comment())
610-
o.setFlags(o.flags() & ~QtCore.Qt.ItemIsDropEnabled)
609+
o.setFlags(int(o.flags()) & ~flag_val(QtCore.Qt.ItemIsDropEnabled))
611610

612611
self.style_comment_node(o)
613612

@@ -1009,7 +1008,7 @@ def style_leaf_node(self, o):
10091008

10101009
def set_parent_node(self, o):
10111010
""" """
1012-
o.setFlags(o.flags() & ~QtCore.Qt.ItemIsSelectable)
1011+
o.setFlags(int(o.flags()) & ~flag_val(QtCore.Qt.ItemIsSelectable))
10131012
setattr(o, "capa_type", CapaExplorerRulegenFeatures.get_node_type_parent())
10141013
self.style_parent_node(o)
10151014

0 commit comments

Comments
 (0)