alphanumeric
alphanumeric

Reputation: 19369

How to modify QTreeWidget Selection Behavior

The code below creates a single QTreeWidget. Clicking any item adds it to the current selection (QTreeWidget is set to support MultiSelection). But I would like to only add to the current selection when Shift or Command modifier key is used.

enter image description here

app = QApplication([])
widget = QTreeWidget()
widget.setSelectionMode(QAbstractItemView.MultiSelection)
widget.setColumnCount(5)
for row in range(7):
    item = QTreeWidgetItem(widget)
    for col in range(5):
        item.setText(col, 'Column %s' % col)
widget.show()
qApp.exec_()

Upvotes: 0

Views: 3352

Answers (2)

Mario Sergio Valdes
Mario Sergio Valdes

Reputation: 31

Only change Multiselection by ExtendedSelection. Would be: widget.setSelectionMode(QAbstractItemView.ExtendedSelection)

Documentation qt5 (version 5.13) https://doc.qt.io/qt-5/qabstractitemview.html#SelectionMode-enum

Upvotes: 1

eyllanesc
eyllanesc

Reputation: 244282

The mouseMoveEvent and mousePressEvent methods must be overwritten and in it decide if any action is taken or not.

class TreeWidget(QTreeWidget):
    def mouseMoveEvent(self, event):
        if QApplication.keyboardModifiers()&(Qt.ShiftModifier|Qt.ControlModifier):
            QTreeWidget.mouseMoveEvent(self, event)

    def mousePressEvent(self, event):
        if QApplication.keyboardModifiers()&(Qt.ShiftModifier|Qt.ControlModifier):
            QTreeWidget.mousePressEvent(self, event)

if __name__ == '__main__':
    import sys

    app = QApplication(sys.argv)
    widget = TreeWidget()
    widget.setSelectionMode(QAbstractItemView.MultiSelection)
    widget.setColumnCount(5)
    for row in range(7):
        item = QTreeWidgetItem(widget)
        for col in range(5):
            item.setText(col, 'Column %s' % col)
    widget.show()
    sys.exit(app.exec_())

Upvotes: 2

Related Questions