Maya(3Dコンピュータグラフィックスアプリケーション)のウィジェットにQTreeWidgetがあります。問題は、ウィジェットがネイティブのCTRL + Aホットキーをブロックしているだけでなく、ツリー内のすべてを選択していることです。このホットキーを親アプリケーションにバブルさせるにはどうすればよいですか?
私はすでに多くのカスタムキー処理にイベントフィルターを使用していますが、ツリーがこれを処理したいと思っているようです。私は矢印キー機能が好きなので、すべてのキーバインディングを無効にしたくはありませんが、必要な場合は...方法を知っていれば
乾杯、
PSここで同様の質問がありましたが、答えは質問を無視します: qt:QTreeViewに自動的に設定されたキーバインディングを無効にしたい
これがQTreeWidgetのためのPythonのソリューションです。
これが私がこれまでPythonで行った中で最も汚いことなのか、それとも拡張メソッドの気の利いたPythonバージョンなのかを判断することはできません。(前者のように感じます。)
問題は、私は実際にはQTreeViewクラスを持っていないということです。これはデザイナーで「tree」という名前で追加されたので、文字通りメソッドをオーバーライドしてから、メソッドから基本機能を呼び出します...
def __init__ #...snip...
self.tree.keyPressEvent = self.onKeyPressEvent # Replace with my method
def onKeyPressEvent(self, event):
if event.key() == Qt.Key_A and event.modifiers() == Qt.ControlModifier:
event.ignore() # Allows fall-through to the parent
return
QtGui.QTreeView.keyPressEvent(self.tree, event) # All other behaviors handled
...それは私にはあまりにも汚いです。この一般的な状況(サブクラスがない)には解決策が必要であることを私は知っていました。私はすでにイベントフィルターを使用しているので、試してみましたが、うまくいきました。重要なのは、イベントが処理されている場所を把握し、両方を使用してevent.ignore()
、イベントをバブルアップしてCTRL+ATrue
をブロックできるようにすることでした。KeyPressEvent
def eventFilter(self, obj, event):
# Filter out all non-KeyPress events
if not event.type() == QEvent.KeyPress:
return False
if event.key() == Qt.Key_A and event.modifiers() == Qt.ControlModifier:
event.ignore() # Allows fall-through to the parent
return True # Block the tree's KeyPressEvent
return False # Do nothing