QMessageBox解析

本文详细介绍了在使用QMessageBox时遇到的问题及其解决方法,包括QMessageBox::question()的调用方式,编译错误的解决,以及QMessageBoxPrivate的showOldMessageBox()和showNewMessageBox()函数的工作原理。通过源码分析,揭示了QMessageBox如何处理按钮和默认按钮设置,以及不同版本的兼容性问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      我在用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值