我在用QMessageBox的时候发现的问题,觉得很有意思,于是就详细的看了一下源码,并打算做一些力所能及的解释。促使我需要理解 QMessageBox是在调用static QMessageBox::question()出现的问题,首先看一下QMessageBox::question()的调用方式:
StandardButton QMessageBox::question(QWidget *parent, //对话框的父窗口
const QString& title, const QString& text, //对话框标题和内容
StandardButtons buttons = Ok, //对话框上的按钮列表
StandardButton defaultButton = NoButton) //默认按钮(即默认的焦点所在按钮)
我在程序中调用QMessageBox::question(this, "Title", "Text");默认显示的是只有一个OK按钮,当我点击对话框上的关闭按钮时,主观上我认为可能返回个NoButton或者Cancel之类的,但事实上我发现返回的仍然是Ok,这使得我无法用默认的按钮设置区分该对话框的返回值。于是我想到用两个按钮来区分,这样调用:
QMessageBox::question(this, "Title", "Text", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
结果编译报错为:无法从"int"转化为"QMessageBox::StandardButton"。我的QT版本用的是4.4.1,那么在网上搜到的用法应该与此相同,但的确编译不通过。于是我产生了观看其源码的想法。
首先StandardButtons是枚举型StandardButton的组合(内部应该是标志位组合),那么在这个地方却不能直接编译通过,当改为:
QMessageBox::question(this, "Title", "Text", QMessageBox::StandardButtons(QMessageBox::Yes | QMessageBox::No), QMessageBox::Yes);
此时则正常通过。之所以改成这样也是参考了qmessagebox.cpp的源码,照葫芦画瓢而已。另外还有返回值的问题,在故意设置的情况下,比较纠结,所以不得不分析一个源码。
这里先介绍QMessageBoxPrivate类(QMessageBoxPrivate是句柄类QMessageBox的实体类)的两个函数,showOldMessageBox()和showNewMessageBox(), 它们都有重载函数,只介绍其中一个即可。
int QMessageBoxPrivate::showOldMessageBox(QWidget *parent, QMessageBox::Icon icon,
const QString &title, const QString &text,
&nbs
QMessageBox解析
最新推荐文章于 2025-05-15 12:46:16 发布