2

私はこのコードを持っています:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

    if (event->type() == QEvent::KeyPress)
    {
        if (keyEvent->key() == Qt::Key_Tab)
            // do something
    }
}

今、私は QTextEdit に入力しています。たとえば、タブ キーを押したとします。次に、QTextEdit にタブが表示されます。しかし、それが起こらないようにしたい場合はどうすればよいでしょうか。たとえば、emacs に精通している場合: 適切な環境 (たとえば C++ モード) では、タブを押すと、行が正しい位置にジャンプします (インデント)。タブをもう一度押しても何も起こりません。これは、コード行が正しい位置にあるためです。

これを行う方法を知っている人はいますか?タブイベントをQTextEditに表示させてから、前の文字(またはそれが定義されているもの)を削除できると思います。

4

2 に答える 2

3

イベント フィルター関数の戻り値を使用すると、QTextEdit が受け取るイベントを制御できます (単にサブクラス化したくない場合)。

if (keyEvent->key() == Qt::Key_Tab)
    return true;

戻るtrueことは、イベントをフィルタリングする必要があることを示します。

于 2012-04-21T13:48:22.257 に答える
2

特別なキーボード処理を行うためにグローバル イベント フィルターは必要ありません (何らかの理由で、ウィジェットが QTextEdit に設定されている部分を編集できない場合を除きます)。QTextEdit からクラスを派生させ、その仮想キー メソッドをオーバーライドするだけです。

http://doc.qt.io/qt-5/qwidget.html#keyPressEvent

特定のkeyEventのデフォルトの動作を取得するには、それを に渡しますQTextEdit::keyPressEvent()。それを無視するには、それを呼び出さずに単に戻ります。

于 2012-04-21T13:20:12.343 に答える