2012-04-29 118 views
13

私はこのライン使用して私のダイアログからのQtで無効にXボタンをしました:Qtを使用してAlt + F4ウィンドウを閉じることを無効にする方法はありますか?

myDialog->setWindowFlags(Qt::Dialog | Qt::Desktop) 

をしかし、私はこのコードを使用してAltキー + F4検出できませんでした:

void myClass::keyPressEvent(QKeyEvent *e) 
{ 
    if ((e->key()==Qt::Key_F4) && (e->modifiers()==Qt::AltModifier)) 
     doSomething(); 
} 

何をを検索する必要がありますか? + F4 Qtで無効にする必要がありますか?

答えて

24

Alt+F4を押すと、トップレベルウィンドウに閉じるイベントが送信されます。ウィンドウクラスでは、closeEvent()を無視してアプリケーションを閉じないようにすることができます。

void MainWindow::closeEvent(QCloseEvent * event) 
{ 
    event->ignore(); 
} 

閉じるボタン(X)を表示したままにしておくと、この方法でもアプリを終了できなくなります。

これは、通常、アプリケーションに「Are you sure?」と表示して閉じるかどうかを決定したり、ユーザーに尋ねたりすることができます。メッセージボックス。

0

また、あなたがあなたのダイアログのクラスでイベントを処理することができます(それはモーダルDLGだ少なくとも場合):

void MyDialog::closeEvent(QCloseEvent* e) 
{ 
    if (condition) 
     e->ignore(); 
    else 
     __super::closeEvent(e); 
} 
3

次のコードは、Altキー+ F4キーを押すと、ダイアログクローズを防ぎ[X]またはエスケープが、 SomeDialog :: close()メソッドを呼び出すことではありません。私たちのすべてに

void SomeDialog::closeEvent(QCloseEvent *evt) { 
    evt->setAccepted(!evt->spontaneous()); 
} 

void SomeDialog::keyPressEvent(QKeyEvent *evt) { 
    // must be overridden but empty if the only you need is to prevent closing by Escape 
} 

幸運;)

+0

あなたは、2個のエラーを持っている:それはPress'はない 'Pressed'とタイプが異なる' keyPressEvent(QKeyEvent * EVT) ''です。しかし、この修正が適用されて...うまくいきます。 :) –

+0

keyPressEvent(QKeyEvent * evt)を単にオーバーライドして空にすると、動作しないなどのその他の問題が発生する可能性があります。たとえば、ユーザーがEnterキーを押して続行する場合など、必要なキーの動作を入力します。したがって、このような特定のケースでは明示的に許可したくないキーを定義する方がはるかに優れています。つまり、BaseWidget :: keyPressEvent(evt)を呼び出すことをお勧めします。BaseWidgetは継承されたものです(QWidget、QDialogなど) –

関連する問題