0
votes

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_()
2

2 Answers

2
votes

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_())
1
votes

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