Qt-QMessageBox用法详解

2024-06-11 20:32
文章标签 详解 qt 用法 qmessagebox

本文主要是介绍Qt-QMessageBox用法详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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用法详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052216

相关文章

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Java中的stream流分组示例详解

《Java中的stream流分组示例详解》Java8StreamAPI以函数式风格处理集合数据,支持分组、统计等操作,可按单/多字段分组,使用String、Map.Entry或Java16record... 目录什么是stream流1、根据某个字段分组2、按多个字段分组(组合分组)1、方法一:使用 Stri

Spring创建Bean的八种主要方式详解

《Spring创建Bean的八种主要方式详解》Spring(尤其是SpringBoot)提供了多种方式来让容器创建和管理Bean,@Component、@Configuration+@Bean、@En... 目录引言一、Spring 创建 Bean 的 8 种主要方式1. @Component 及其衍生注解

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、