4

我用 做了一个树形结构QTreeWidget,效果很好。但我有一个问题。通常,对于树形结构,如果我想取消选择全部,我单击树形小部件的空白区域。但QTreeWidget似乎不支持这一点(或者我不知道如何)。

子分类或其他方法可以解决问题吗?确定单击空白区域似乎是解决方案的关键,但我找不到信号或任何东西。

4

1 回答 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)
于 2011-12-15T17:18:14.707 回答