在业务中,我们需要按指定的方式才能关闭当前对话框。如下图需输入密码点击确认后,界面才能关闭。
1.禁用关闭按钮
在对话框初始化部分添加将关闭按钮禁用
//MFC
CMenu *pSysMenu = GetSystemMenu(FALSE);
ASSERT(pSysMenu != NULL);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_DISABLED);
//QT
setWindowFlags(windowFlags() & ~Qt::WindowCloseButtonHint);
2.禁用Esc、Alt+F4、回车键
前两种是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+F4
return 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);
}
}
void MyDLG::closeEvent(QCloseEvent *event)
{
event->ignore();
}
但是由于我使用keyPressEvent检测alt+f4不成功,使用closeEvent又会把确定按钮的离开也禁用了。于是新方案可以使用在上层界面的closeEvent中调用该窗口,输入密码不正确即为ignore,正确即为accept。