Bootstrap

MFC与QT中禁用Esc、Alt+F4、关闭图标

在业务中,我们需要按指定的方式才能关闭当前对话框。如下图需输入密码点击确认后,界面才能关闭。

方法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+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);
	}
}

方法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();
}

;