在业务中,我们需要按指定的方式才能关闭当前对话框。如下图需输入密码点击确认后,界面才能关闭。
方法1:通过禁用界面的按钮以及键盘上对应关闭对话框的按键。
1.灰度化关闭按钮
在对话框初始化部分添加将关闭按钮禁用
//MFC
CMenu *pSysMenu = GetSystemMenu(FALSE);
ASSERT(pSysMenu != NULL);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_DISABLED);//QT
setWindowFlags(windowFlags() & ~Qt::WindowCloseButtonHint);
2.Esc、Alt+F4、Enter键过滤
前两种是windows下常用的关闭按键,回车键也可一并禁用,因为有的场景误触回车,可能会触发按钮点击,按钮中调用了OnOK()这样的函数也会导致页面关闭。
mfc具体实现为重载按键检测事件,qt经查询可以重写keyPressEvent、closeEvent。
//MFC
BOOL MyDLG::PreTranslateMessage(MSG* pMsg)
{if (pMsg->wParam == VK_RETURN)return TRUE;if (pMsg->wParam == VK_ESCAPE)return TRUE;if (pMsg->message == WM_SYSKEYDOWN && pMsg->wParam == VK_F4) //屏蔽ALT+F4return TRUE;return CDialog::PreTranslateMessage(pMsg);
}
//QT
void MyDLG::keyPressEvent(QKeyEvent *event) {if (event->key() == Qt::Key_F4 &&(event->modifiers() & Qt::AltModifier)) {event->ignore(); }else if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter) {event->ignore();}else {QWidget::keyPressEvent(event);}
}
方法2:可对这些退出按键和行为对应的行为函数进行重写,达到防止对话框关闭行为的目的。
1.重写Close,右上角关闭按钮和Alt+F4会触发该函数
//MFC
void DLGTest::OnClose()
{// TODO: 在此添加消息处理程序代码和/或调用默认值//CDialogEx::OnClose();
}
//QT
void MyDLG::closeEvent(QCloseEvent *event)
{event->ignore();
}
2.重写Cancel,MFC中Esc键会触发该函数。而在qt中按Esc默认是点击Cancel按钮,如果你的对话框没有Cancel按钮,Esc就不会有任何操作。如果有Cancel按钮,就修改Cancel按钮按下的槽函数,将其中的reject()屏蔽。
//MFC
void DLGTest::OnCancel()
{//CDialogEx::OnCancel();
}
3.重写OK。这个一般是我们留的唯一的退出方式,根据需要选择是否屏蔽。
void DLGTest::OnOK()
{CDialogEx::OnOK();
}