点击项目视图空白区域时清除选中项

4 投票
1 回答
4574 浏览
提问于 2025-04-17 08:25

我用 QTreeWidget 创建了一个树形结构,运行得很好。但是我遇到了一个问题。一般来说,在树形结构中,如果我想取消所有选择,我会点击树形控件的空白区域。但 QTreeWidget 似乎不支持这个功能(或者我找不到方法)。

是不是可以通过子类化或者其他方法来解决这个问题呢?判断点击空白区域似乎是解决的关键,但我找不到相关的信号或者其他东西。

1 个回答

9

下面的示例代码会在点击空白区域时,或者在树形控件获得键盘焦点时按下Esc键时,清除选中的项和当前项。这段代码适用于任何继承自QAbstractItemView的控件(不仅仅是QTreeWidget):

class MyWidget(QTreeWidget):
    def keyPressEvent(self, event):
        if (event.key() == Qt.Key_Escape and
            event.modifiers() == Qt.NoModifier):
            self.selectionModel().clear()
        else:
            super(MyWidget, self).keyPressEvent(event)

    def mousePressEvent(self, event):
        if not self.indexAt(event.pos()).isValid():
            self.selectionModel().clear()
        super(MyWidget, self).mousePressEvent(event)

为了避免创建子类,可以使用事件过滤器来实现相同的功能:

class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.widget = QTreeWidget()
        self.widget.installEventFilter(self)
        self.widget.viewport().installEventFilter(self)
        ...

    def eventFilter(self, source, event):
        if ((source is self.widget and
             event.type() == QEvent.KeyPress and
             event.key() == Qt.Key_Escape and
             event.modifiers() == Qt.NoModifier) or
            (source is self.widget.viewport() and
             event.type() == QEvent.MouseButtonPress and
             not self.widget.indexAt(event.pos()).isValid())):
            self.widget.selectionModel().clear()
        return super(Window, self).eventFilter(source, event)

撰写回答