3

私はテキストベースのやることプログラムを実装しています。から継承するCommandInputウィジェットがありますQLineEdit。基本的に、「追加」、「削除」、「編集」などのキーワードで始まるコマンドがいくつかあります。

いくつかのショートカットを実装したいと思います。

  1. Ctrl+Aウィジェットにフォーカスがあるときに、setText("add \"\"")最後から2番目の位置にカーソルを置くことができるようにします。add "|"
  2. Tabウィジェットにフォーカスがあるとき、たとえばユーザーが最初のキーワードを入力したときに、次addのコマンドを完了することができます。add "|"

重要な問題は、ウィジェットにフォーカスがある場合、ショートカットが機能しないことです。私は次の方法を試しました:

1/オーバーライドkeyPressEvent。キーが意図したTabとおりに機能しません。そして、それが機能したとしても、のようなkeySequenceに対してそれを行う方法がわかりませんCtrl+A

void CommandInput::keyPressEvent(QKeyEvent *keyEvent)

{
    switch(keyEvent->key())
    {
    case Qt::Key_Tab;
        emit add_activated();
    default:
        QLineEdit::keyPressEvent(keyEvent);
    }
}

2/初期化時にショートカットを作成します。これも機能しません。

CommandInput::CommandInput(QWidget *parent)
    : QLineEdit(parent)
{
    tab_shortcut = new QShortcut(QKeySequence("Tab"),this);
    add_shortcut = new QShortcut(QKeySequence("Ctrl+A"),this);

    connect(tab_shortcut, SIGNAL(activated()),
            this, SIGNAL(tab_activated()));
    connect(add_shortcut, SIGNAL(activated()),
            this, SIGNAL(add_activated()));
}

この問題について私を助けていただければ幸いです。ありがとう!

4

2 に答える 2

2

ここでは、オーバーライドkeyPressEventがおそらく推奨されるアプローチです。「Tab」が期待通りに動かないのは、break発した後のステートメントがないからだと推測しますadd_activated()。「Ctrl+A」の場合はmodifiers()、キー イベントを確認する必要があります。そのため、次のkeyPressEventようになります。

void CommandInput::keyPressEvent(QKeyEvent* keyEvent)
{
   if (keyEvent->key() == Qt::Key_Tab)
   {
      emit add_activated();
   }
   else if (keyEvent->key() == Qt::Key_A && 
            keyEvent->modifiers() == Qt::ControlModifier)
   {
      // Code for Ctrl+A goes here.
   }
   else
   {
      QLineEdit::keyPressEvent(keyEvent);
   }
}

これは私の(Linux)マシンで動作するようです。

于 2012-11-06T18:09:44.700 に答える