QMessageBox 是 Qt 框架中常用的一个类,可以生成各式各样、各种用途的消息对话框,如图 1 所示。

图 1 QMessageBox消息对话框

很多 GUI 程序都会用到消息对话框,且很多场景中使用的消息对话框是类似的,唯一的区别只是提示信息不同。为了提高程序员的开发效率,避免重复地“造轮子”,Qt 开发者设计好了几种通用的 QMessageBox 消息对话框,需要时可以直接使用。

通用的QMessageBox消息框

Qt 提供了 6 种通用的 QMessageBox 消息对话框,通过调用 QMessageBox 类中的 6 个静态成员方法,可以直接在项目中使用它们。

1) information消息对话框

information 对话框常用于给用户提示一些关键的信息,它的外观如下图所示:

图 2 information 消息对话框

在项目中使用 information 消息对话框,直接调用 QMessageBox 类中的 information() 静态成员方法即可,该方法的语法格式如下:

StandardButton QMessageBox::information(QWidget *parent,const QString &title,const QString &text,StandardButtons buttons = Ok,StandardButton defaultButton = NoButton)

各个参数的含义是:

  • parent:指定消息对话框的父窗口,消息提示框会作为一个独立的窗口显示在父窗口的前面。消息提示框从弹出到关闭的整个过程中,用户无法操作父窗口,更不能删除父窗口;
  • title:指定消息对话框的标题,即图 2 中的 Titile;
  • text:指定消息对话框的具体内容,即图 2 中的 text;
  • buttons:指定消息对话框中包含的按钮。默认情况下,消息对话框只包含一个按钮,即图 2 中显示的 "OK" 按钮。根据需要,我们可以用|按位或运算符在消息对话框中设置多个按钮,例如 QMessageBox::Ok|QMessageBox::Cancel
  • defaultButton:指定 Enter 回车键对应的按钮,用户按下回车键时就等同于按下此按钮。注意,defaultButton 参数的值必须是 buttons 中包含的按钮,当然也可以不手动指定,QMessageBox 会自动从 buttons 中选择合适的按钮作为 defaultButton 的值。

information() 函数会返回用户按下的按钮。StandardButton 是 QMessageBox 类中定义的枚举类型,每个枚举值代表一种按钮。StandardButton 类型中的值有很多,下表给大家罗列了几个常用的:

表 1 QMessageBox::StandardButton 枚举类型值
枚举值 含 义
QMessageBox::Ok 标有 "OK" 字样的按钮,通常用来表示用户接受或同意提示框中显示的信息。
QMessageBox::Open 标有 "Open" 字样的按钮。
QMessageBox::Save 标有 "Save" 字样的按钮。
QMessageBox::Cancel 标有 "Cancel" 字样的按钮。点击此按钮,通常表示用户拒绝接受提示框中显示的信息。
QMessageBox::Close 标有 "Close" 字样的按钮。
QMessageBox::Discard 标有 "Discard" 或者 "Don't Save" 字样的按钮,取决于运行平台。
QMessageBox::Apply 标有 "Apply" 字样的按钮。
QMessageBox::Reset 标有 "Reset" 字样的按钮。
QMessageBox::Yes 标有 "Yes" 字样的按钮。
QMessageBox::No 标有 "No" 字样的按钮。

例如,使用 information() 函数实现图 2 所示的对话框,实现代码为:


  • QMessageBox::StandardButton result = QMessageBox::information(&widget, "Title","text");

其中,widget 是我们创建好的 QWidget 窗口,创建好的 information 对话框会显示在 widget 窗口的前面。通过用 result 接收 information() 函数的返回值,我们可以得知用户选择的是哪个按钮。

2) critical消息对话框

critical 消息对话框常用于给用户提示“操作错误”或“运行失败”的信息,它的外观如下图所示:

图 3 critical 消息对话框

项目中使用 critical 消息对话框,直接调用 QMessageBox 类提供的 critical() 静态成员方法即可,该方法的语法格式为:

StandardButton QMessageBox::critical(QWidget *parent,const QString &title,const QString &text,StandardButtons buttons = Ok,StandardButton defaultButton = NoButton)

各个参数的含义以及返回值的含义,都与 information() 函数相同,这里不再重复赘述。

例如,使用 critical() 函数实现图 3 所示的对话框,实现代码为:


  • QMessageBox::StandardButton result=QMessageBox::critical(&widget, "Title","text");

其中,widget 是我们创建好的 QWidget 窗口,创建好的 critical 对话框会显示在 widget 窗口的前面。

3) question消息对话框

question 对话框常用于向用户提出问题并接收用户的答案,它的外观如下图所示:

图 4 question消息对话框

项目中使用 question 对话框,可以直接调用 QMessageBox 类的 question() 静态成员方法,该方法的语法格式为:

StandardButton QMessageBox::question(QWidget *parent,const QString &title,const QString &text,StandardButtons buttons = StandardButtons( Yes | No ),StandardButton defaultButton = NoButton)

各个参数的含义以及返回值的含义,都与 information() 函数相同。

例如,使用 question() 函数实现图 4 所示的对话框,实现代码为:


  • QMessageBox::StandardButton result=QMessageBox::question(&widget, "Title","text");

其中,widget 是我们创建好的 QWidget 窗口,创建好的 question 对话框会显示在 widget 窗口的前面。

4) warning消息对话框

warining 对话框常用于向用户显示一些警告信息,它的外观如下图所示:

图 5 warning消息对话框

项目中使用 warning 对话框,可以直接调用 QMessageBox 类的 warning() 静态成员方法,该方法的语法格式为:

StandardButton QMessageBox::warning(QWidget *parent,const QString &title,const QString &text,StandardButtons buttons = Ok,StandardButton defaultButton = NoButton)

各个参数的含义以及返回值的含义,都与 information() 函数相同。

例如,使用 warning() 函数实现图 5 所示的对话框,实现代码为:


  • QMessageBox::StandardButton result=QMessageBox::warning(&widget, "Title","text");

其中,widget 是我们创建好的 QWidget 窗口,创建好的 warning 对话框会显示在 widget 窗口的前面。

5) about和aboutQt对话框

about 对话框常常作为介绍某个产品或某项功能的临时窗口,它的外观如下图所示:

图 6 about消息对话框

注意,about 对话框没有固定的图标,它显示的图标可能来自父窗口、包含父窗口的顶层窗口等,也可能使用和 information 对话框相同的图标。

项目中使用 about 对话框,直接调用 QMessageBox 类提供的 about() 静态成员方法即可,该方法的语法格式如下:

void QMessageBox::about(QWidget *parent, const QString &title, const QString &text)

各个参数的含义和与 information() 函数相同。和前面的几种对话框不同,about对话框中只包含一个默认的 Ok 按钮,且 about() 函数没有返回值。

aboutQt 可以看做是 about 对话框的一个具体实例,它只能显示 Qt 的介绍信息,如下图所示:

图 7 aboutQt对话框

项目中使用 aboutQt 对话框,直接调用 QMessageBox 类提供的 aboutQt() 静态成员方法即可,该函数的语法格式如下:

void QMessageBox::aboutQt(QWidget *parent, const QString &title = QString())

我们只能设置 aboutQt 对话框的 parent 父窗口和 title 标题,不能自定义它的内容。所以在实际场景中,aboutQt() 对话框很少使用。

自定义QMessageBox对话框

以上 6 种通用的 QMessageBox 对话框,界面上的图片无法修改,按钮上的文字也无法修改(例如无法将 OK、No 改成中文)。如果想修改它们,就需要自定义一个 QMessageBox 对话框。

QMessageBox对话框的创建

程序中创建 QMessageBox 对象,必须先引入<QMessageBox>头文件。QMessageBox 类提供了两个构造函数,分别是:

QMessageBox::QMessageBox(QWidget *parent = Q_NULLPTR)
QMessageBox::QMessageBox(Icon icon,const QString &title,const QString &text,StandardButtons buttons = NoButton,QWidget *parent = Q_NULLPTR,Qt::WindowFlags f = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint)

第一个构造函数可以创建一个“空白”对话框,即对话框中不包含任何文本和按钮。当然,通过调用 QMessageBox 类提供的成员方法,可以向“空白”对话框中添加各种元素(图标、文本、按钮等)。

第二个构造函数中,各个参数的含义是:

  • icon:指定对话框中的图片。Icon 是 QMessageBox 类中定义的枚举类型,内部包含 QMessageBox::NoIcon、QMessageBox::Question、QMessageBox::Information、QMessageBox::Warning、QMessageBox::Critical 几个值,分别表示:不指定图片、question对话框的图片(图 4)、information对话框的图片(图 2)、warning对话框的图片(图 5)、critical对话框的图片(图 3)。
  • title:指定对话框的标题;
  • text:指定对话框中显示的文本信息;
  • buttons:指定对话框中包含的的按钮,可选值如表 1 所示。
  • parent:指定对话框的父窗口;
  • f:指定对话框的属性。WindowFlags 是 Qt 提供的枚举类型,内部包含的值有很多,有的用来指定对话框的用途(比如 Qt::Dialog 表示对话框窗口),有的用来指定对话框的外观(比如 MSWindowsFixedSizeDialogHint 表示给对话框添加一个细的边框)

举个简单的例子:


  1. #include <QApplication>
  2. #include <QMessageBox>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. //创建 QMessageBox 类对象
  7. QMessageBox MyBox(QMessageBox::Question,"Title","text",QMessageBox::Yes|QMessageBox::No);
  8. //使 MyBox 对话框显示
  9. MyBox.exec();
  10. return a.exec();
  11. }

程序中创建了一个 MyBox 对话框,通过调用 QMessageBox 提供的 exec() 方法,可以使 MyBox 对话框弹出。运行程序可以发现,MyBox 对话框的外观和图 4 的 question 对话框完全一样。

QMessageBox对话框的使用

QMessageBox 类提供了很多功能实用的成员方法,方便我们快速地制作出实际场景需要的对话框。

下表给大家罗列了常用的一些 QMessageBox 类成员方法:

表 2 QMessageBox 常用成员方法
成员方法 功 能
void QMessageBox::setWindowTitle(const QString &title) 设置对话框的标题。
void setText(const QString &text) 设置对话框中要显示的文本。
void setIconPixmap(const QPixmap &pixmap) 设置对话框中使用的图片。
QAbstractButton *QMessageBox::clickedButton() const 返回用户点击的按钮。
QPushButton *QMessageBox::addButton(const QString &text, ButtonRole role) 向对话框中添加按钮,text 为按钮的文本,role 是 QMessageBox::ButtonRole 枚举类型的变量,用于描述按钮扮演的角色,它的可选值有 QMessageBox::AcceptRole(同 OK 按钮)、QMessageBox::RejectRole(同 Cancel 按钮)等。
int QMessageBox::exec() 使当前对话框弹出,除非用户关闭对话框,否则对话框将一直存在。此外,当对话框中使用的都是 Qt 提供的按钮时,该方法可以监听用户点击的是哪个按钮,并将该按钮对应的枚举值返回;如果对话框中包含自定义按钮,需要借助 clickedButton() 方法确定用户点击的按钮。

举个简单的例子:


  1. #include <QApplication>
  2. #include <QMessageBox>
  3. #include <QPushButton>
  4. #include <QDebug>
  5. int main(int argc, char *argv[])
  6. {
  7. QApplication a(argc, argv);
  8. QMessageBox MBox;
  9. MBox.setWindowTitle("QMessageBox自定义对话框");
  10. MBox.setText("这是一个自定义的对话框");
  11. MBox.setIconPixmap(QPixmap("C:\\Users\\xiexuewu\\Desktop\\icon_c.png"));
  12. QPushButton *agreeBut = MBox.addButton("同意", QMessageBox::AcceptRole);
  13. MBox.exec();
  14. if (MBox.clickedButton() == (QAbstractButton*)agreeBut) {
  15. //在 Qt Creator 的输出窗口中输出指定字符串
  16. qDebug() << "用户点击了同意按钮";
  17. }
  18. return a.exec();
  19. }

程序运行结果如图 8 所示,点击“同意”按钮后,我们会在 Qt Creator 的输出窗口中看到“用户点击了同意按钮”。

图 8 自定义的 QMessageBox 对话框

QMessageBox的信号和槽

操作 QMessageBox 对话框,最常用的信号函数是 buttonClicked() 函数,最常用的槽函数是 exec() 函数,它们的语法格式和功能如下表所示。

表 3 QMessageBox信号和槽
信号函数 功 能
void QMessageBox::buttonClicked(QAbstractButton *button) 当用户点击对话框中的某个按钮时,会触发此信号函数,该函数会将用户点击的按钮作为参数传递给槽函数。
槽函数 功 能
int QMessageBox::exec() 弹出对话框,直到用户手动关闭对话框,此对话框将一直存在。

举个简单的例子:


  1. //main.cpp
  2. #include <QApplication>
  3. #include <QWidget>
  4. #include <QMessageBox>
  5. #include <QPushButton>
  6. #include <QAbstractButton>
  7. QPushButton* agreeBut;
  8. QPushButton* disagreeBut;
  9. class MyWidget:public QWidget{
  10. Q_OBJECT
  11. public slots:
  12. void buttonClicked(QAbstractButton * butClicked);
  13. };
  14. void MyWidget::buttonClicked(QAbstractButton * butClicked){
  15. if(butClicked == (QAbstractButton*)disagreeBut){
  16. this->close();
  17. }
  18. }
  19. int main(int argc, char *argv[])
  20. {
  21. QApplication a(argc, argv);
  22. //创建主窗口
  23. MyWidget myWidget;
  24. myWidget.setWindowTitle("主窗口");
  25. myWidget.resize(400,300);
  26. //创建消息框
  27. QMessageBox MyBox(QMessageBox::Question,"","");
  28. MyBox.setParent(&myWidget);
  29. //设置消息框的属性为对话框,它会是一个独立的窗口
  30. MyBox.setWindowFlags(Qt::Dialog);
  31. MyBox.setWindowTitle("协议");
  32. MyBox.setText("使用本产品,请您严格遵守xxx规定!");
  33. //自定义两个按钮
  34. agreeBut = MyBox.addButton("同意", QMessageBox::AcceptRole);
  35. disagreeBut = MyBox.addButton("拒绝", QMessageBox::RejectRole);
  36. myWidget.show();
  37. //添加信号和槽,监听用户点击的按钮,如果用户拒绝,则主窗口随之关闭。
  38. QObject::connect(&MyBox,&QMessageBox::buttonClicked,&myWidget,&MyWidget::buttonClicked);
  39. MyBox.exec();
  40. return a.exec();
  41. }
  42. //MyWidget类的定义应该放到 .h 文件中,本例中将其写到 main.cpp 中,程序最后需要添加 #include "当前源文件名.moc" 语句,否则无法通过编译。
  43. #include "main.moc"

程序执行结果为:

Qt-QMessageBox用法详解相关推荐

  1. Qt sender()用法详解

    sender()是QObject类的方法,声明如下: QObject *sender() const; Qt助手的解释如下: Returns a pointer to the object that ...

  2. Qt Creator用法详解

    Qt自带集成开发环境(IDE),名为Qt Creator.它可以在Linux.OS X和Windows上运行,并提供智能代码完成.语法高亮.集成帮助系统.调试器和剖析器集成,还集成了所有主要的版本控制 ...

  3. Qt QPlainTextEdit用法详解

    QPlainTextEdit 是一个多行文本编辑器,用于显示和编辑多行简单文本.另外,还有一个 QTextEdit 组件,是一个所见即所得的可以编辑带格式文本的组件,以 HTML 格式标记符定义文本格 ...

  4. QT QtableView操作详解

    本文实现了使用QtableView控件来显示数据,数据源使用txt文本作为数据源,使用了QStandardItemModel作为数据模型来实现了对TableView空间的初始化,和对txt数据源的增删 ...

  5. Qt QLineEdit单行输入框用法详解

    Qt QLineEdit单行输入框用法详解 QLineEdit 是 Qt 提供的一个控件类,它直接继承自 QWdiget 类,专门用来创建单行输入框,如下图所示: 图 1 单行文本输入框 实际开发中, ...

  6. Qt QPushButton按钮用法详解

    Qt QPushButton按钮用法详解 按钮是 GUI 开发中最常用到的一种控件,作为一款著名的 GUI 开发框架,Qt 提供了很多种按钮,比如 QPushButton(普通按钮).QRadioBu ...

  7. Qt QListWidget列表框用法详解

    Qt QListWidget列表框用法详解 很多应用程序中需要以列表的形式向用户展示数据(资源),比如 Windows 操作系统会以列表的方式展示很多张桌面背景图(如图 1a) 所示),再比如很多音乐 ...

  8. emit python 作用_PyQT5 emit 和 connect的用法详解

    对于PyQT4, PyQT5在一些使用上有着比较明显的变化有很大的变化,让人惊讶是在emit和connect上的一些变化比较有意思,相信也是QT为了更好的和Python相结合做的改进. 先上一张图: ...

  9. emit python 作用,PyQT5 emit 和 connect的用法详解

    对于PyQT4, PyQT5在一些使用上有着比较明显的变化有很大的变化,让人惊讶是在emit和connect上的一些变化比较有意思,相信也是QT为了更好的和Python相结合做的改进. 先上一张图: ...

  10. python emit_PyQT5 emit 和 connect的用法详解

    对于PyQT4, PyQT5在一些使用上有着比较明显的变化有很大的变化,让人惊讶是在emit和connect上的一些变化比较有意思,相信也是QT为了更好的和Python相结合做的改进. 先上一张图: ...

最新文章

  1. springmvc+spring+mybatis+maven项目集成shiro进行用户权限控制【转】
  2. 通过仿真和综合认识T触发器(Verilog HDL语言描述T触发器)
  3. 红帽Linux 6.5上配置ASM流程
  4. java String 转boolean
  5. VTK:图表之MinimumSpanningTree
  6. java读c二进制文件_如何使用JAVA读取C / Matlab创建的二进制文件
  7. vs设计窗口不见了_碳纤维的巅峰:VS沛纳海616V3
  8. 怎样通过FineReader 的“文本”窗口检查文本
  9. 分支限界算法c语言_算法学习计划
  10. 博弈论(巴什博奕,威佐夫博弈,尼姆博弈)
  11. [剑指Offer]9.用两个栈实现队列
  12. Java中的断言 Assert
  13. html简单网页设计实验实践结论,网页设计社会实践报告
  14. 2009程序员考试大纲
  15. 这就是为什么上帝和魔鬼都喜欢数学......
  16. 实现商品分类回显(笔记)
  17. 如何通俗易懂理解云原生
  18. 新闻稿标题写作中的五大技巧
  19. 计算机毕业设计Python+uniapp学生考勤系统小程序(小程序+源码+LW)
  20. 决策树常见的面试点整理

热门文章

  1. 使用 stm32实现锂电充电_实现高负载锂电池的超快速充电需要哪些要求?
  2. HDFS中常用的shell命令总结
  3. 贵州计算机专业强的专科学校,贵州排名靠前的五年制大专学校--贵州计算机学校...
  4. macappstore登不上去_武功山观星归来,缆车登顶,不徒步攻略!
  5. 我的世界基岩版json_我的世界基岩版1.16
  6. 秀操作:函数宏的三种封装方式
  7. 一文带你认识FPGA~
  8. 千万不要小瞧那些不好好写代码的程序员
  9. verilog设计UART发送接收及各种错误仿真
  10. php空间xpyun_无限流量免费 PHP 空间 – FreeWebHostingArea