1

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
4

1 に答える 1

3

を再実装しkeyPressEvent、CTRL+Aを押したときにイベントを無視します。

コードは次のようになります。

MyTreeView::keyPressEvent(QKeyEvent *e)
{
    if(e->key() == Qt::Key_A && e->modifiers() == Qt::ControlModifier)
    {
        e->ignore();
        QWidget::keyPressEvent(e); // Not sure about this. Please try and report!
    }
    else
        QTreeView::keyPressEvent(e);
}
于 2012-07-18T01:45:45.460 に答える