2012-04-29 692 views
13

我用這條線已經禁用X按鈕,在Qt的從我的對話框:如何禁用使用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(); 
} 

什麼我應該做的檢測Alt鍵 + F4或Qt中禁用它?

回答

24

Alt+F4導致關閉事件被髮送到你的頂層窗口。在您的窗口課程中,您可以覆蓋closeEvent()以忽略它並阻止您的應用程序關閉。

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

如果您離開關閉按鈕(X)可見,此方法也會禁用它關閉您的應用程序。

這通常是用來給應用程序一個機會,以決定是否要通過顯示的關閉與否或者詢問用戶「你確定嗎?」消息框。

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

你已經得到了兩個錯誤:它是'keyPressEvent(QKeyEvent * EVT)''Press'不'Pressed'和類型是不同的。但是,應用此修復程序...它運行良好。 :) – 2017-01-12 20:03:49

+0

只是重寫keyPressEvent(QKeyEvent * EVT)和留空,可能會引起其他問題,如不輸入工作可能需要關鍵的行爲,例如,當我們要允許用戶通過點擊回車鍵繼續。因此,在這種特定情況下定義我們不想明確允許的密鑰會更好。換句話說,最好調用BaseWidget :: keyPressEvent(evt),其中BaseWidget是繼承的東西(可以是QWidget,QDialog等) – 2017-08-29 14:25:14