1

ユーザーがQWidgetベースのウィンドウに入力すると、すべての入力キーを処理する必要があったため、次の 2 つのソリューションをQLineEdit試しました。keyPressEvent()QWidget

A.

void Window::keyPressEvent (QKeyEvent *e)
{
   switch (e->key())
   {
     // handle other short cuts
     default:
       QApplication::sendEvent (lineEdit , e);
       break;
   }
}

ええと、これは時々インターフェース全体をクラッシュさせますresize window

B.

void Window::keyPressEvent (QKeyEvent *e)
{
   switch (e->key())
   {
     // handle other short cuts
     default:

     if ( ! lineEdit.hasFocus () )
     {
        lineEdit.setFocus ();
        lineEdit.setText (e->key()); 
        // i wanted to push the first key input to that QLineEdit , but how ?
        // or i'll miss it
     }
     break;
   }
}

また、常にフォーカスを与えることを考えてlineEditいますが、他のイベントはメイン UI で処理する必要があるため、それはできません。

アップデート

キー入力をフィルタリングしてもクラッシュしませんが、なぜですか?

 default:
        if ( e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete ||
                (e->key() >= Qt::Key_A && e->key() <= Qt::Key_Z )
                )
            QApplication::sendEvent(filter , e);
        break;
    }
4

3 に答える 3

1

sendEvent を使用して制御できないイベント オブジェクトを送信しているため、クラッシュが発生していると思います。

Qt イベント システムは、イベントを取得して他の方向にスローすることを期待していないと思います。行編集が期待する前に、イベント オブジェクトが破棄されている可能性があります。入力キーを除外している場合、ライン編集はそのような種類のキーストロークを気にせず、そうでない場合ほどイベントオブジェクトを使用していないため、おそらくクラッシュしていません.

本当に機能を使用したい場合はsendEvent()、スタック上に独自の QKeyEvent を作成し、それを関数に渡すことをお勧めします(ここでsendEvent()示されているように)。または、次のようなことを行うこともできます。

lineEdit.setText( lineEdit.text() + event->text() );
于 2011-10-09T23:06:05.623 に答える
0

それを行う最も簡単な方法は、QKeyEvent::text代わりに使用することであり、問​​題QKeyEvent::keyありません。のコピーを作成してQKeyEventに渡すこともできますQLineEdit。ただし、これらは解決策というよりはむしろハックです。フォーカスがあるときにメイン ウィンドウにショートカットが必要な場合QLineEdit(このウィンドウにあると仮定) は、コンテキストを使用QShortcutして使用できます。これにより、常にアクティブな状態を維持できます。Qt::WidgetWithChildrenShortcutLineEdit

于 2011-10-09T19:35:57.270 に答える
0

ウィジェットがイベントを処理しない場合、それはその親に転送されます。したがって、sendEvent() を使用して子に転送することは、再帰を行う可能性があるため危険です。

于 2014-01-29T08:24:03.620 に答える