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

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

1.禁用关闭按钮

在对话框初始化部分添加将关闭按钮禁用

cpp 复制代码
//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。

cpp 复制代码
//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。

相关推荐
利刃大大38 分钟前
【c++中间件】etcd存储系统 && 服务注册 && 服务发现 && 二次封装
c++·中间件·服务发现·etcd·服务中心
报错小能手1 小时前
C++笔记 仿函数(函数对象)
开发语言·c++·笔记
草莓熊Lotso1 小时前
《算法闯关指南:优选算法--模拟》--39.替换所有问号,40.提莫攻击
开发语言·c++·算法·模拟
艾莉丝努力练剑2 小时前
【Linux基础开发工具 (三)】Vim从入门到精通(下):效率翻倍的编辑技巧与个性化配置攻略
linux·运维·服务器·c++·ubuntu·centos·vim
草莓熊Lotso2 小时前
C++ STL set 系列完全指南:从底层原理、核心接口到实战场景
开发语言·c++·人工智能·经验分享·网络协议·算法·dubbo
AA陈超7 小时前
ASC学习笔记0014:手动添加一个新的属性集
c++·笔记·学习·ue5
Run_Teenage8 小时前
C++:智能指针的使用及其原理
开发语言·c++·算法
Mr_WangAndy10 小时前
C++_chapter15_C++重要知识点_auto,function,bind,decltype
c++·decltype·bind·function·可调用对象
万象.10 小时前
QT基础及对象树的认识
c++·qt
小张成长计划..12 小时前
【C++】2:cin和cout的介绍和使用,函数的缺省参数
c++