でツリー構造を作成しましたがQTreeWidget
、うまく機能します。しかし、それには問題があります。通常、ツリー構造ですべての選択を解除したい場合は、ツリー ウィジェットの空白の領域をクリックします。しかし、QTreeWidget
それをサポートしていないようです (または方法がわかりません)。
サブクラス化などで問題を解決できますか? 空白領域のクリックを決定することが解決の鍵のようですが、シグナルも何も見つかりません。
でツリー構造を作成しましたがQTreeWidget
、うまく機能します。しかし、それには問題があります。通常、ツリー構造ですべての選択を解除したい場合は、ツリー ウィジェットの空白の領域をクリックします。しかし、QTreeWidget
それをサポートしていないようです (または方法がわかりません)。
サブクラス化などで問題を解決できますか? 空白領域のクリックを決定することが解決の鍵のようですが、シグナルも何も見つかりません。
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)