Qt开发:MessageBox怎么调出标题栏那个问号按钮?

写Qt对话框的时候,你有没有发现一个事?

同样是弹出个提示框,有的窗口标题栏右上角只有一个关闭按钮,有的呢,关闭按钮旁边还多了个小问号。

就是下面这个效果:

左边一个问号,右边一个叉号。

很多人写了好几年Qt都没注意过这个东西。今天就来说说,这个问号按钮到底是怎么来的,怎么让你的MessageBox也带上它。

先说说默认情况

默认情况下,你用QMessageBox::information()、QMessageBox::warning()这些静态函数弹出来的框,标题栏是没有那个问号的。

就只有一个关闭按钮。

那什么时候会出现问号呢?

其实这是Qt的一个窗口标志在控制。

关键就在这个标志上

Qt里有个枚举值,叫 Qt::WindowContextHelpButtonHint。

直译过来就是"窗口上下文帮助按钮提示"。

只要你的窗口设置了这个标志,标题栏上就会多出那个小问号。

反过来,如果你不想要这个问号,把这个标志去掉就行。

那为什么有的MessageBox默认有,有的没有?

因为QMessageBox自己内部做了处理。

你用静态函数弹出来的标准对话框,Qt默认是把这个问号按钮关掉的。

但如果你自己new一个QMessageBox对象出来,自己设置属性,那它默认是带这个问号的。

怎么手动控制?

很简单,三行代码的事。

如果你想让你的窗口带问号:

msgBox.setWindowFlag(Qt::WindowContextHelpButtonHint, true);

如果你不想要这个问号:

msgBox.setWindowFlag(Qt::WindowContextHelpButtonHint, false);

就这么简单。

一个完整的例子

给你看个实际的代码:

QMessageBox msgBox;

msgBox.setWindowTitle("提示");

msgBox.setText("确定要删除这个文件吗?");

msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);

msgBox.setWindowFlag(Qt::WindowContextHelpButtonHint, true);

msgBox.exec();

这样弹出来的框,标题栏右上角就会有那个问号。

点了问号之后会怎样?

点了那个问号之后,鼠标会变成一个带问号的箭头。

这时候你点对话框里的任何一个控件,比如那个"Yes"按钮,它就会触发一个WhatsThisClicked事件。

你可以在这个事件里弹个说明,告诉用户这个按钮是干嘛的。

不过说实话,现在用这个功能的人已经很少了。

大多数软件要么直接把说明写在文字里,要么靠tooltip。

但你要是想做个复古风格的界面,比如仿Windows XP那种感觉,加上这个问号按钮还挺有那味的。

总结一下

那个小问号按钮,本质上就是Qt的一个窗口标志控制的。

想要就加上 Qt::WindowContextHelpButtonHint,不想要就去掉。

QMessageBox的静态函数默认是关掉这个按钮的,自己new的话默认是开的。

下次写对话框的时候,不妨试试加上这个小细节,瞬间就有那味儿了。

相关推荐
李子红了时2 小时前
EncFS MP中文版汉化下载(免费文件加密工具)
windows·安全
辻弋2012 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
会飞的土拨鼠呀3 小时前
Windows 系统关闭虚拟内存文件pagefile.sys
windows
传奇开心果编程5 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
工作10年+,存储芯片行业5 小时前
Linux NVMe 中断排查与性能优化:CPU 亲和性
linux·运维·服务器·windows·性能优化·ssd·pcie
lpfasd1236 小时前
WinSW在Win7上失败真相-实测与修复
windows·nginx
万山寒7 小时前
windows使用WinSW注册服务
windows
白搞电子9 小时前
ESP32-S31 项目如何制作 Windows 一键烧录包:完整镜像、esptool 与数据边界
windows·stm32·单片机
apple_6926588510 小时前
Github开源免费 红果短剧 Windows 电脑桌面版:民间开发者做的第三方播放器,不用装模拟器了
windows