1

QDialogを開くイベントフィルターがインストールされたQMainWindowがあります。メイン ウィンドウは、Enter キーのキー リリースを処理します。しかし、QDialog が開いていてフォーカスがあるときに Enter キーを押すと、メイン ウィンドウもこのイベントをキャッチします。

どうすればそれを防ぐことができますか?QDialog にイベント フィルターをインストールして、keyReleaseEvent および keyPressEvent 関数を再実装し、親 (現在は 0) を変更しようとしましたが、何も役に立たないようです...

QMainWindow のイベント フィルターを変更して、キー リリースの代わりにキー プレスを処理するようにすると、QDialog は正常に動作しますが、回避しようとしている他のバグが発生することに注意してください...

bool Window::eventFilter(QObject *, QEvent *event) {
 if (type == QEvent::KeyRelease) {
   QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);

   switch(keyEvent->key()) {
   case Qt::Key_Enter:
     // do something here
     break;
   default:
     break;
   }
}

Dialog::Dialog(unsigned int num, QWidget *parent)
: QDialog(parent), num(_num)
{
   ui.setupUi(this);
   ui.btnOK->setEnabled(false);

   connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(accept()));
   connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(reject()));

   installEventFilter(this);
}

bool Dialog::eventFilter(QObject *, QEvent *event) {
 return true;
} 

前もって感謝します

4

1 に答える 1

2

webclectic の最初のアプローチを試しe->ignore()e->accept()くださいignore()

void MyDialog::keyReleaseEvent(QKeyEvent* e)
{
    QDialog::keyReleaseEvent(e);
    if (e->key() == Qt::Key_Enter)
        e->accept();
}

それとも、モーダルダイアログを試してみるべきですか?

更新:ダイアログを Enter キーのリリースに応答させたい場合は、常に QDialog の実装を呼び出す必要があります。

于 2012-04-23T12:12:37.073 に答える