20

私は を持ってQDialogQDialogButtonBoxます。[ OK ] ボタンと[キャンセル]ボタンがアクティブになります。時折、ダイアログの状態に基づいて [OK] ボタンを無効にしたり非表示にしたりします。何をしても、Enter キーを押すと常に [OK] ボタンがアクティブになるようです。私は本当にこれが起こることを望んでいません。私が試してみました:

  • ボタンを表示/非表示/有効/無効にするたびにデフォルトおよびautoDefaultプロパティをfalseに設定する
  • [OK] ボタンにイベント フィルターをインストールして、キー イベント (押されたものと離されたもの) をインターセプトし、戻る、入力する、スペースを入力する
  • ボタンのフォーカス ポリシーをNoFocusに設定する

上記のすべての組み合わせで、Enter キーは引き続きダイアログを受け入れます。これをブロックする方法を知っている人はいますか? このような単純なものをブロックできるように思えますか?

4

9 に答える 9

20

デフォルト ボタンへのReturnおよびキーの転送を処理するコードは にあるため、キー プレス イベントのフィルタリングはダイアログ自体で行う必要があります。EnterQDialog::keyPressEvent

void Dialog::keyPressEvent(QKeyEvent *evt)
{
    if(evt->key() == Qt::Key_Enter || evt->key() == Qt::Key_Return)
        return;
    QDialog::keyPressEvent(evt);
}

または

theDialog−>installEventFilter(anotherClassObject);

bool AnotherClass::eventFilter(QObject *obj, QEvent *evt)
{
    if(evt->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(evt);
        if(keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return )
            return true; // mark the event as handled
    }
    return false;
}
于 2013-04-06T00:15:08.577 に答える
4

ダイアログに通常の QPushButtons がある場合、ボタンに autoDefault および/またはデフォルトのプロパティが設定されている場合、デフォルトのボタンを取得します。これは、Enter キーがトリガーするものです。その場合、ボタンの autoDefault を取り除き、別のウィジェットで Enter キーを押してもダイアログが閉じなくなりました。

QDialogBu​​ttonBox の場合、おそらくボタンを繰り返し処理して、ダイアログの ctor でこの機能をオフにすることができます。ここではテストされていませんが、動作するはずです。そうでない場合は、QDialog 自体にも設定されるデフォルトのボタンがあるかどうかも確認する必要があります。

于 2015-01-27T16:11:04.917 に答える
2

QDialog には というプライベート スロットがありaccept()ます。QDialogBu​​ttonBox が発行されるたびaccepted()に (リターン キーを押すか、[OK] をクリックして)、そのプライベート スロットが呼び出されます。だから、それらを切断してみてください。

disconnect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));

これは私にとってはうまくいきました。

于 2013-04-08T20:43:16.063 に答える
0

ダイアログのaccept()メソッドで、[OK] ボタンにフォーカスがあることを確認します。

void accept() override
{ if (!dialogButtonBox->button(QDialogButtonBox::Ok)->hasFocus())
  return;

...

  QDialog::accept();
}
于 2019-06-24T19:18:02.053 に答える