2012-04-23 8 views
1

QDialogを開くイベントフィルターがインストールされたQMainWindowがあります。 メインウィンドウは、Enterキーのキーリリースを処理します。 しかし、QDialogが開いている状態でEnterキーを押すと、メインウィンドウでもこのイベントが検出されます。QMainWindowはQDialogによって捕捉されるべきイベントを処理しています

どうしたら起こるのを防ぐことができますか? QReleaseEventとkeyPressEvent関数を再実装するために、QDialogにイベントフィルタをインストールしようとしましたが、親(現在は0)を変更していますが、何も役に立ちません...

イベントフィルタそれはQDialogが正常に動作し、キー解除するのではなく、キーを押して処理しますが、その後、私は避けるようにしようとしている他のバグを取得するようにQMainWindow ...事前に

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; 
} 

感謝の

+0

ここにコードを表示できますか? – lazyhammer

+0

私はコードを追加しました。 – kakush

答えて

2

てみwebclecticさん最初のアプローチですが、0139以降はe->ignore()e->accept()に置き換えてくださいの動作は、達成したいのとは逆です。

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

または、おそらくモーダルダイアログを試す必要がありますか?

UPDATE:ダイアログがEnterキーのリリースに応答するようにするには、常にQDialogの実装を呼び出す必要があります。

+0

イベントがelseステートメントでのみ伝搬されるので、彼が 'accept'または' ignore'を使用するかどうかは関係ありません。 QDialog :: keyReleaseEvent(e)はイベントディスパッチャーを制御できないので、受信者がイベントを望んでいないので、 'ignore'関数を使うべきです(コード準備のため) – pnezis

+2

私の知る限り、問題ありません。 return/escのキーコードをチェックし、accept()/ reject()を実行する必要がある場合はそれをトリガーし、伝播が行われるディスパッチャにイベントを返します。私が間違っている? – lazyhammer

+0

Dmitriyは正しいです。 'QDialog :: keyReleaseEvent()'を呼び出すだけで、この関数の基本クラスの実装を実行できます。イベントが伝播するかどうかは関係ありません。さもなければ、accept/ignore関数が存在する必要はありません。 – Chris

関連する問題