C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > Qt QMessageBox使用

Qt中QMessageBox使用小结

作者:byxdaz

本文主要介绍了Qt中QMessageBox使用小结,包括基本消息框、带按钮的消息框、自定义消息框、按钮类型、图标设置以及长文本显示,具有一定的参考价值,感兴趣的可以了解一下

1.基本消息框

简单信息提示

#include <QMessageBox>
 
// 信息提示框
QMessageBox::information(nullptr, "标题", "这是一条信息");
 
// 警告框
QMessageBox::warning(nullptr, "警告", "这是一个警告!");
 
// 错误框  
QMessageBox::critical(nullptr, "错误", "发生了一个错误!");
 
// 询问框
QMessageBox::question(nullptr, "询问", "你确定要执行此操作吗?");

2.带按钮的消息框

基本按钮配置

// 带 Yes/No 按钮
QMessageBox::StandardButton reply;
reply = QMessageBox::question(nullptr, "确认", "确定要退出吗?",
                             QMessageBox::Yes | QMessageBox::No);
 
if (reply == QMessageBox::Yes) {
    qDebug() << "用户选择了 Yes";
} else {
    qDebug() << "用户选择了 No";
}
 
// 带多个按钮
QMessageBox::StandardButton reply = QMessageBox::question(
    nullptr, 
    "保存文件", 
    "文件已修改,是否保存?",
    QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel
);
 
switch (reply) {
case QMessageBox::Save:
    qDebug() << "保存文件";
    break;
case QMessageBox::Discard:
    qDebug() << "不保存";
    break;
case QMessageBox::Cancel:
    qDebug() << "取消操作";
    break;
}

3.自定义消息框

基本示例

QMessageBox msgBox;
msgBox.setWindowTitle("自定义标题");
msgBox.setText("这是一条详细的消息内容");
msgBox.setInformativeText("这是附加信息");
msgBox.setDetailedText("这是详细的技术信息:\n错误代码: 0x1234\n文件: main.cpp");
msgBox.setIcon(QMessageBox::Information);
msgBox.setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::Ok);
 
int ret = msgBox.exec();
 
if (ret == QMessageBox::Ok) {
    qDebug() << "用户点击了确定";
}

设置父窗口

// 在类的方法中使用 this 作为父对象
void MainWindow::showMessage()
{
    QMessageBox::information(this, "提示", "操作成功完成");
    
    // 或者使用对象方式
    QMessageBox msgBox(this);
    msgBox.setWindowTitle("父对象示例");
    msgBox.setText("这个对话框会居中显示在父窗口");
    msgBox.exec();
}

设置默认按钮

QMessageBox msgBox;
msgBox.setText("请选择操作");
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::No);  // 默认选中 No 按钮
msgBox.exec();

自定义告警对话框(按钮居中显示)

void myselfBoxWarn(const QString & title, const QString & content)
{
    QMessageBox msgBox;
    msgBox.setWindowTitle(title);
    msgBox.setText(content);
    msgBox.setStandardButtons(QMessageBox::Ok);
 
    // 设置字体大小 - 使用样式表
    msgBox.setStyleSheet("QLabel{ font-size: 32px; }"
                         "QPushButton{ font-size: 32px; width: 200px; height: 36px; }"
                         "QDialogButtonBox {qproperty-centerButtons: true;}");
 
    msgBox.exec();
}

自定义告警提示选择对话框(按钮居中显示)

QMessageBox msgBox;
msgBox.setWindowTitle(tr("manage"));
msgBox.setText(tr("set success. must be restarted to take effect."));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::Yes);
 
    // 设置样式表
    msgBox.setStyleSheet(
        "QMessageBox {"
        "    font-size: 16px;"
        "    font-family: Source Han Sans SC;"
        "}"
        "QMessageBox QLabel {"
        "    font-size: 16px;"
        "    min-width: 400px;"
        "    min-height: 60px;"
        "}"
        "QMessageBox QPushButton {"
        "    font-size: 14px;"
        "    min-width: 100px;"
        "    min-height: 35px;"
        "    padding: 8px;"
        "}"
        "QDialogButtonBox {"
        "    qproperty-centerButtons: true;"  // 使用 Qt 属性
        "}"
        );
 
    if(msgBox.exec() == QMessageBox::Yes){
 
        // 获取当前程序的路径和参数
        QString program = QApplication::applicationFilePath();
        QStringList arguments = QApplication::arguments();
 
        // 启动新进程(startDetached 会在当前程序退出后运行)
        QProcess::startDetached(program, arguments);
 
        // 关闭当前程序
        QApplication::quit();
    }

设置图标和样式

QMessageBox msgBox;
msgBox.setWindowTitle("样式化消息框");
msgBox.setText("<h3>HTML 格式文本</h3>");
msgBox.setInformativeText("支持 <b>粗体</b>、<i>斜体</i> 等 HTML 标签");
 
// 设置图标
msgBox.setIconPixmap(QPixmap(":/images/icon.png").scaled(64, 64));
 
// 设置样式
msgBox.setStyleSheet(
    "QMessageBox {"
    "    background-color: #f0f0f0;"
    "    font-size: 14px;"
    "}"
    "QMessageBox QPushButton {"
    "    min-width: 80px;"
    "    min-height: 30px;"
    "}"
);
 
msgBox.exec();

4. 按钮(默认和自定义)

常用按钮类型

// 标准按钮组合
QMessageBox::Ok                    // 确定
QMessageBox::Open                  // 打开
QMessageBox::Save                  // 保存
QMessageBox::Cancel                // 取消
QMessageBox::Close                 // 关闭
QMessageBox::Discard               // 放弃
QMessageBox::Apply                 // 应用
QMessageBox::Reset                 // 重置
QMessageBox::RestoreDefaults       // 恢复默认
QMessageBox::Help                  // 帮助
QMessageBox::SaveAll               // 全部保存
QMessageBox::Yes                   // 是
QMessageBox::YesToAll              // 全是
QMessageBox::No                    // 否
QMessageBox::NoToAll               // 全否
QMessageBox::Abort                 // 中止
QMessageBox::Retry                 // 重试
QMessageBox::Ignore                // 忽略
QMessageBox msgBox;
msgBox.setWindowTitle("按钮角色");
 
// 不同角色的按钮
msgBox.addButton("确定", QMessageBox::AcceptRole);      // 接受操作
msgBox.addButton("应用", QMessageBox::ApplyRole);       // 应用更改
msgBox.addButton("重置", QMessageBox::ResetRole);       // 重置设置
msgBox.addButton("是", QMessageBox::YesRole);           // 肯定回答
msgBox.addButton("否", QMessageBox::NoRole);            // 否定回答
msgBox.addButton("拒绝", QMessageBox::RejectRole);      // 拒绝操作
msgBox.addButton("帮助", QMessageBox::HelpRole);        // 请求帮助
msgBox.addButton("自定义", QMessageBox::ActionRole);    // 自定义操作
 
msgBox.setText("不同角色的按钮示例");
msgBox.exec();

带图标的自定义按钮

QMessageBox msgBox;
msgBox.setWindowTitle("带图标的按钮");
msgBox.setText("请选择操作:");
 
// 创建带图标的按钮
QPushButton* okButton = new QPushButton(QIcon(":/icons/ok.png"), "确定");
QPushButton* cancelButton = new QPushButton(QIcon(":/icons/cancel.png"), "取消");
QPushButton* helpButton = new QPushButton(QIcon(":/icons/help.png"), "帮助");
 
// 添加到消息框
msgBox.addButton(okButton, QMessageBox::AcceptRole);
msgBox.addButton(cancelButton, QMessageBox::RejectRole);
msgBox.addButton(helpButton, QMessageBox::HelpRole);
 
msgBox.setDefaultButton(okButton);
 
msgBox.exec();
 
if (msgBox.clickedButton() == okButton) {
    qDebug() << "确定";
} else if (msgBox.clickedButton() == helpButton) {
    QMessageBox::information(&msgBox, "帮助", "这是帮助信息");
}

5. 图标(默认和自定义)

默认图标

QMessageBox::Information - 蓝色信息图标
QMessageBox::Warning - 黄色警告图标
QMessageBox::Critical - 红色错误图标
QMessageBox::Question - 蓝色问号图标
QMessageBox::NoIcon - 无图标
#include <QMessageBox>
 
// 1. 无图标
QMessageBox msgBox;
msgBox.setIcon(QMessageBox::NoIcon);
msgBox.setText("没有图标的消息框");
msgBox.exec();
 
// 2. 信息图标
QMessageBox::information(nullptr, "信息", "这是一个信息提示");
 
// 3. 警告图标  
QMessageBox::warning(nullptr, "警告", "这是一个警告消息");
 
// 4. 错误图标
QMessageBox::critical(nullptr, "错误", "这是一个错误消息");
 
// 5. 询问图标
QMessageBox::question(nullptr, "询问", "这是一个询问消息");

使用 setIcon() 方法设置图标

QMessageBox msgBox;
msgBox.setWindowTitle("设置图标类型");
 
// 设置不同的图标类型
msgBox.setIcon(QMessageBox::Information);    // 信息图标
// msgBox.setIcon(QMessageBox::Warning);     // 警告图标
// msgBox.setIcon(QMessageBox::Critical);    // 错误图标
// msgBox.setIcon(QMessageBox::Question);    // 询问图标
 
msgBox.setText("使用 setIcon() 方法设置图标");
msgBox.exec();

自定义图标

1)使用 setIconPixmap()

QMessageBox msgBox;
msgBox.setWindowTitle("自定义图标");
msgBox.setText("使用自定义图标的消息框");
 
// 使用自定义图标替换默认图标
QPixmap customPixmap(":/images/my_icon.png");  // 从资源文件
// 或者: QPixmap customPixmap("C:/icons/custom.png");  // 从文件系统
 
// 缩放图标到合适大小
customPixmap = customPixmap.scaled(64, 64, Qt::KeepAspectRatio, Qt::SmoothTransformation);
 
msgBox.setIconPixmap(customPixmap);
msgBox.exec();

2)完全自定义图标的方法

QMessageBox msgBox;
msgBox.setWindowTitle("完全自定义");
 
// 重要:必须先设置为 NoIcon,否则自定义图标可能不显示
msgBox.setIcon(QMessageBox::NoIcon);
 
// 然后设置自定义图标
QPixmap customIcon(":/images/success.png");
customIcon = customIcon.scaled(48, 48, Qt::KeepAspectRatio, Qt::SmoothTransformation);
msgBox.setIconPixmap(customIcon);
 
msgBox.setText("操作成功完成!");
msgBox.exec();

6. 长文本显示

自动换行(默认行为)

QMessageBox 会自动根据对话框宽度换行:

QMessageBox::information(this, "自动换行", 
    "这是一段很长的文本,QMessageBox 会自动根据对话框的宽度进行换行处理,"
    "确保所有内容都能正确显示给用户,不需要手动添加换行符。");

手动添加换行符

QMessageBox::information(this, "手动换行",
    "第一行文本\n"
    "第二行文本\n"
    "第三行文本\n"
    "这是最后一行");

使用 HTML 标签控制格式

QMessageBox msgBox;
msgBox.setWindowTitle("HTML 格式");
msgBox.setText("<html>"
               "<p>这是第一段文本,可以自动换行</p>"
               "<p>这是第二段文本</p>"
               "<p style='color: red;'>这是红色文本</p>"
               "<ul>"
               "<li>列表项 1</li>"
               "<li>列表项 2</li>"
               "<li>列表项 3</li>"
               "</ul>"
               "</html>");
msgBox.exec();

设置固定宽度的消息框

QMessageBox msgBox;
msgBox.setWindowTitle("固定宽度");
msgBox.setText("这是一段很长的文本,我们将通过设置样式表来控制对话框的宽度,从而实现更好的换行效果。");
msgBox.setStyleSheet("QMessageBox { min-width: 500px; }");
msgBox.exec();

使用 setText 和 setInformativeText 组合

QMessageBox msgBox;
msgBox.setWindowTitle("组合文本");
msgBox.setText("主要信息:操作成功完成");
msgBox.setInformativeText("详细信息:文件已保存到指定位置,所有更改都已应用。"
                         "您可以继续其他操作或查看保存的文件。");
msgBox.exec();

超长文本使用 setDetailedText

QMessageBox msgBox;
msgBox.setWindowTitle("详细文本");
msgBox.setText("操作完成");
msgBox.setInformativeText("基本操作已执行成功");
msgBox.setDetailedText("这是详细的执行日志:\n"
                      "1. 步骤一:初始化系统... 完成\n"
                      "2. 步骤二:加载配置文件... 完成\n"
                      "3. 步骤三:处理数据... 完成\n"
                      "4. 步骤四:保存结果... 完成\n"
                      "5. 步骤五:清理资源... 完成\n"
                      "所有操作执行成功,耗时 2.3 秒");
msgBox.exec();

到此这篇关于Qt中QMessageBox使用小结的文章就介绍到这了,更多相关Qt QMessageBox使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文