QMessageBox主要用来通知用户或者请求用户提问和接收应答一个模态对话框。
一.对话框的构成
图标是有标准图标的,可以直接调用。
我们声明的消息框,初始状态都是模态的(阻塞程序,这里就不演示了),如果想把它变成非模态的,可以直接设置
mbox = new QMessageBox();
mbox->resize(100,100);
mbox->setModal(false);
// mbox->setWindowModality(Qt::NonModal);
mbox->show();
二.内容展示
1.图标
标准图标的展示方法
mbox->setIcon(QMessageBox::NoIcon ); //无图标
mbox->setIcon(QMessageBox::Information); //信息图标
mbox->setIcon(QMessageBox::Warning ); //警告图标
mbox->setIcon(QMessageBox::Critical ); //严重警告图标
mbox->setIcon(QMessageBox::Question ); //提问图标
2.内容
消息框的内容是支持富文本的,我们可以用setText()函数直接设置其提示内容,此外还有一个setInformativeText(),是用来显示提示文本的
mbox->setTextFormat(Qt::RichText);
mbox->setText("<h2>文件已被修改</h2><h3>是否保存</h3>");
// mbox->setText("<h3>是否保存</h3>");
mbox->setInformativeText("是否保存");
在上面的效果加个案例
mbox->setTextFormat(Qt::RichText);
mbox->setText("<h2>文件已被修改</h2><h3>是否保存</h3>");
// mbox->setText("<h3>是否保存</h3>");
mbox->setInformativeText("是否保存");
QCheckBox *mcheckbox = new QCheckBox("下次不再提示");
mbox->setCheckBox(mcheckbox);
还有展示详情文本
详情文本设置后会有个显示详细内容的按钮,点击按钮会显示详情。
mbox->setDetailedText("详情文档");
2.按钮
按钮的定义有些复杂,分很多种,我们一步步来看
a.按钮的角色
按钮在对话框中是有角色分工的(ButtonRole)。在了解按钮的配置时我们要先了解按钮有哪些角色分工
如果我们需要自定义个按钮,这个按钮是起了哪个角色的作用,我们就可以给出相应的定义
InvalidRole = … // type: ‘QMessageBox.ButtonRole’
AcceptRole = … // type: ‘QMessageBox.ButtonRole’
RejectRole = … // type: ‘QMessageBox.ButtonRole’
DestructiveRole = … // type: ‘QMessageBox.ButtonRole’
ActionRole = … // type: ‘QMessageBox.ButtonRole’
HelpRole = … // type: ‘QMessageBox.ButtonRole’
YesRole = … // type: ‘QMessageBox.ButtonRole’
NoRole = … // type: ‘QMessageBox.ButtonRole’
ResetRole = … // type: ‘QMessageBox.ButtonRole’
ApplyRole = … // type: ‘QMessageBox.ButtonRole’
b.添加移除自定义按钮
如果想要移除按钮的话可以直接删除按钮控件,要注意的是后面两个添加自定义按钮的方法是有个返回值的,因为我们并不是先实例一个按钮在添加在对话框中而是直接在添加的时候定义,那么添加的这个按钮控件作为返回值被返回。
QPushButton *mbt = new QPushButton("帮助");
mbox->addButton(mbt,QMessageBox::HelpRole);
mbox->removeButton(mbt);
b.默认按钮设置
有些时候我们想弹出的对话框某一个按钮是在焦点上的,那么我们就可以直接通过键盘的回车键对其进行操作,那么就用到下面的方法:设置默认按钮
标准按钮定义
mbox->setDefaultButton(mbt);
效果如图:
c.关联退出按钮(键盘Esc)
我们可以把键盘Esc键关联给某个按钮,当键盘Esc键被按下时对话框退出,并且关联的按钮会触发clicked事件。
QPushButton *mbt_exec = new QPushButton("退出");
mbox->addButton(mbt_exec,QMessageBox::HelpRole);
mbox->setEscapeButton(mbt_exec);
3.文本交互标志
默认情况下消息框里的文本是不能被选中的,详情是可以选中并复制。我们可以通过下面的方法改变其状态
QMessageBox::setTextInteractionFlags(self, flags: typing.Union[QtCore.Qt.TextInteractionFlags, QtCore.Qt.TextInteractionFlag])
NoTextInteraction = … // type: ‘Qt.TextInteractionFlag’
TextSelectableByMouse = … // type: ‘Qt.TextInteractionFlag’
TextSelectableByKeyboard = … // type: ‘Qt.TextInteractionFlag’
LinksAccessibleByMouse = … // type: ‘Qt.TextInteractionFlag’
LinksAccessibleByKeyboard = … // type: ‘Qt.TextInteractionFlag’
TextEditable = … // type: ‘Qt.TextInteractionFlag’
TextEditorInteraction = … // type: ‘Qt.TextInteractionFlag’
TextBrowserInteraction = … // type: ‘Qt.TextInteractionFlag’
4.主要静态方法
有些静态方法是很好用的,我们可以直接弹出个消息框用来给出提示信息。也就是说直接给封装好的消息界面,只要把关键的提示字在初始化的时候定义,就可以直接用了。
QMessageBox::about(QWidget *parent, const QString &title, const QString &text);
QMessageBox::question(QWidget *parent, const QString &title,
const QString &text, StandardButtons buttons = StandardButtons(Yes | No),
StandardButton defaultButton = NoButton);‘QMessageBox.StandardButton’] = …,
defaultButton: ‘QMessageBox.StandardButton’ = …)
QMessageBox::warning(QWidget *parent, const QString &title,
const QString &text, StandardButtons buttons = Ok,
StandardButton defaultButton = NoButton);
这些对话框方法基本一样,就是图标不同。并且这种方法是有返回值的(返回值为每个StandardButton所对应的枚举值)下面的表就给出了各种按键所对应的枚举值。
enum StandardButton {
// keep this in sync with QDialogButtonBox::StandardButton and QPlatformDialogHelper::StandardButton
NoButton = 0x00000000,
Ok = 0x00000400,
Save = 0x00000800,
SaveAll = 0x00001000,
Open = 0x00002000,
Yes = 0x00004000,
YesToAll = 0x00008000,
No = 0x00010000,
NoToAll = 0x00020000,
Abort = 0x00040000,
Retry = 0x00080000,
Ignore = 0x00100000,
Close = 0x00200000,
Cancel = 0x00400000,
Discard = 0x00800000,
Help = 0x01000000,
Apply = 0x02000000,
Reset = 0x04000000,
RestoreDefaults = 0x08000000,
FirstButton = Ok, // internal
LastButton = RestoreDefaults, // internal
YesAll = YesToAll, // obsolete
NoAll = NoToAll, // obsolete
Default = 0x00000100, // obsolete
Escape = 0x00000200, // obsolete
FlagMask = 0x00000300, // obsolete
ButtonMask = ~FlagMask // obsolete
};