致伟 發表於 2025-12-24 09:34:09

Qt中QMessageBox使用小结

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.基本消息框</li><ul class="second_class_ul"><li>简单信息提示</li></ul><li>2.带按钮的消息框</li><ul class="second_class_ul"><li>基本按钮配置</li></ul><li>3.自定义消息框</li><ul class="second_class_ul"></ul><li>4. 按钮(默认和自定义)</li><ul class="second_class_ul"><li>常用按钮类型</li><li>带图标的自定义按钮</li></ul><li>5. 图标(默认和自定义)</li><ul class="second_class_ul"><li>默认图标</li><li>自定义图标</li></ul><li>6. 长文本显示</li><ul class="second_class_ul"><li>自动换行(默认行为)</li><li>手动添加换行符</li><li>使用 HTML 标签控制格式</li><li>设置固定宽度的消息框</li><li>使用 setText 和 setInformativeText 组合</li><li>超长文本使用 setDetailedText</li></ul></ul></div><p class="maodian"></p><h2>1.基本消息框</h2>
<p class="maodian"></p><h3>简单信息提示</h3>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QMessageBox&gt;

// 信息提示框
QMessageBox::information(nullptr, "标题", "这是一条信息");

// 警告框
QMessageBox::warning(nullptr, "警告", "这是一个警告!");

// 错误框
QMessageBox::critical(nullptr, "错误", "发生了一个错误!");

// 询问框
QMessageBox::question(nullptr, "询问", "你确定要执行此操作吗?");</pre></div>
<p class="maodian"></p><h2>2.带按钮的消息框</h2>
<p class="maodian"></p><h3>基本按钮配置</h3>
<div class="jb51code"><pre class="brush:cpp;">// 带 Yes/No 按钮
QMessageBox::StandardButton reply;
reply = QMessageBox::question(nullptr, "确认", "确定要退出吗?",
                           QMessageBox::Yes | QMessageBox::No);

if (reply == QMessageBox::Yes) {
    qDebug() &lt;&lt; "用户选择了 Yes";
} else {
    qDebug() &lt;&lt; "用户选择了 No";
}

// 带多个按钮
QMessageBox::StandardButton reply = QMessageBox::question(
    nullptr,
    "保存文件",
    "文件已修改,是否保存?",
    QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel
);

switch (reply) {
case QMessageBox::Save:
    qDebug() &lt;&lt; "保存文件";
    break;
case QMessageBox::Discard:
    qDebug() &lt;&lt; "不保存";
    break;
case QMessageBox::Cancel:
    qDebug() &lt;&lt; "取消操作";
    break;
}</pre></div>
<p class="maodian"></p><h2>3.自定义消息框</h2>
<p>基本示例</p>
<div class="jb51code"><pre class="brush:cpp;">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() &lt;&lt; "用户点击了确定";
}</pre></div>
<p>设置父窗口</p>
<div class="jb51code"><pre class="brush:cpp;">// 在类的方法中使用 this 作为父对象
void MainWindow::showMessage()
{
    QMessageBox::information(this, "提示", "操作成功完成");
   
    // 或者使用对象方式
    QMessageBox msgBox(this);
    msgBox.setWindowTitle("父对象示例");
    msgBox.setText("这个对话框会居中显示在父窗口");
    msgBox.exec();
}</pre></div>
<p>设置默认按钮</p>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox msgBox;
msgBox.setText("请选择操作");
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
msgBox.setDefaultButton(QMessageBox::No);// 默认选中 No 按钮
msgBox.exec();</pre></div>
<p>自定义告警对话框(按钮居中显示)</p>
<div class="jb51code"><pre class="brush:cpp;">void myselfBoxWarn(const QString &amp; title, const QString &amp; 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();
}</pre></div>
<p>自定义告警提示选择对话框(按钮居中显示)</p>
<div class="jb51code"><pre class="brush:cpp;">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();
    }</pre></div>
<p>设置图标和样式</p>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox msgBox;
msgBox.setWindowTitle("样式化消息框");
msgBox.setText("&lt;h3&gt;HTML 格式文本&lt;/h3&gt;");
msgBox.setInformativeText("支持 &lt;b&gt;粗体&lt;/b&gt;、&lt;i&gt;斜体&lt;/i&gt; 等 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();</pre></div>
<p class="maodian"></p><h2>4. 按钮(默认和自定义)</h2>
<p class="maodian"></p><h3>常用按钮类型</h3>
<div class="jb51code"><pre class="brush:cpp;">// 标准按钮组合
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                // 忽略</pre></div>
<div class="jb51code"><pre class="brush:cpp;">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();</pre></div>
<p class="maodian"></p><h3>带图标的自定义按钮</h3>
<div class="jb51code"><pre class="brush:cpp;">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() &lt;&lt; "确定";
} else if (msgBox.clickedButton() == helpButton) {
    QMessageBox::information(&amp;msgBox, "帮助", "这是帮助信息");
}</pre></div>
<p class="maodian"></p><h2>5. 图标(默认和自定义)</h2>
<p class="maodian"></p><h3>默认图标</h3>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox::Information - 蓝色信息图标
QMessageBox::Warning - 黄色警告图标
QMessageBox::Critical - 红色错误图标
QMessageBox::Question - 蓝色问号图标
QMessageBox::NoIcon - 无图标</pre></div>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QMessageBox&gt;

// 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, "询问", "这是一个询问消息");</pre></div>
<p>使用 setIcon() 方法设置图标</p>
<div class="jb51code"><pre class="brush:cpp;">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();</pre></div>
<p class="maodian"></p><h3>自定义图标</h3>
<p>1)<strong>使用 setIconPixmap()</strong></p>
<div class="jb51code"><pre class="brush:cpp;">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();</pre></div>
<p>2)<strong>完全自定义图标的方法</strong></p>
<div class="jb51code"><pre class="brush:cpp;">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();</pre></div>
<p class="maodian"></p><h2>6. 长文本显示</h2>
<p class="maodian"></p><h3>自动换行(默认行为)</h3>
<p>QMessageBox 会自动根据对话框宽度换行:</p>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox::information(this, "自动换行",
    "这是一段很长的文本,QMessageBox 会自动根据对话框的宽度进行换行处理,"
    "确保所有内容都能正确显示给用户,不需要手动添加换行符。");</pre></div>
<p class="maodian"></p><h3>手动添加换行符</h3>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox::information(this, "手动换行",
    "第一行文本\n"
    "第二行文本\n"
    "第三行文本\n"
    "这是最后一行");</pre></div>
<p class="maodian"></p><h3>使用 HTML 标签控制格式</h3>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox msgBox;
msgBox.setWindowTitle("HTML 格式");
msgBox.setText("&lt;html&gt;"
               "&lt;p&gt;这是第一段文本,可以自动换行&lt;/p&gt;"
               "&lt;p&gt;这是第二段文本&lt;/p&gt;"
               "&lt;p style='color: red;'&gt;这是红色文本&lt;/p&gt;"
               "&lt;ul&gt;"
               "&lt;li&gt;列表项 1&lt;/li&gt;"
               "&lt;li&gt;列表项 2&lt;/li&gt;"
               "&lt;li&gt;列表项 3&lt;/li&gt;"
               "&lt;/ul&gt;"
               "&lt;/html&gt;");
msgBox.exec();</pre></div>
<p class="maodian"></p><h3>设置固定宽度的消息框</h3>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox msgBox;
msgBox.setWindowTitle("固定宽度");
msgBox.setText("这是一段很长的文本,我们将通过设置样式表来控制对话框的宽度,从而实现更好的换行效果。");
msgBox.setStyleSheet("QMessageBox { min-width: 500px; }");
msgBox.exec();</pre></div>
<p class="maodian"></p><h3>使用 setText 和 setInformativeText 组合</h3>
<div class="jb51code"><pre class="brush:cpp;">QMessageBox msgBox;
msgBox.setWindowTitle("组合文本");
msgBox.setText("主要信息:操作成功完成");
msgBox.setInformativeText("详细信息:文件已保存到指定位置,所有更改都已应用。"
                         "您可以继续其他操作或查看保存的文件。");
msgBox.exec();</pre></div>
<p class="maodian"></p><h3>超长文本使用 setDetailedText</h3>
<div class="jb51code"><pre class="brush:cpp;">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();</pre></div>
<p>到此这篇关于Qt中QMessageBox使用小结的文章就介绍到这了,更多相关Qt QMessageBox使用内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Qt之QMessageBox的具体使用</li><li>QT实现QMessageBox中文按钮示例详解</li><li>Qt&nbsp;QMessageBox类使用教程</li><li>Pyqt5如何让QMessageBox按钮显示中文示例代码</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Qt中QMessageBox使用小结