• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
sn-genuine
博客园    首页    新随笔    联系   管理    订阅  订阅

Qt QDialog对话,QMessageBox 消息对话,QFileDialog 文件对话

Qt QDialog对话,QMessageBox 消息对话,QFileDialog 文件对话笔记

1、自定义QDialog对话框

核心API

API 说明
exec() 模态阻塞弹出对话框,代码暂停执行,窗口关闭后返回int结果码
accept() 确认关闭,返回值:QDialog::Accepted
reject() 取消关闭,返回值:QDialog::Rejected
done(int val) 自定义返回码,关闭对话框,返回传入整数

信号

  • accepted():调用accept()触发
  • rejected():调用reject()触发
  • finished(int res):窗口关闭必定触发,携带返回结果

mydialog.cpp

#include "mydialog.h"
#include "ui_mydialog.h"

MyDialog::MyDialog(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::MyDialog)
{
    ui->setupUi(this);
}

MyDialog::~MyDialog()
{
    delete ui;
}

//确认按钮
void MyDialog::on_acceptBtn_clicked()
{
    this->accept();
}

//取消按钮
void MyDialog::on_rejectBtn_clicked()
{
    this->reject();
}

//自定义返回码按钮
void MyDialog::on_doneBtn_clicked()
{
    this->done(10);
}

mainwindow.cpp 使用示例

#include "mydialog.h"
#include <QDebug>

void MainWindow::on_modalDlg_clicked()
{
    MyDialog dlg;
    //绑定对话框信号
    connect(&dlg,&MyDialog::finished,this,[=](int res){
        qDebug()<<"result: "<<res;
    });
    connect(&dlg,&MyDialog::accepted,this,[=](){
        qDebug()<<"accepted 信号被发射了...";
    });
    connect(&dlg,&MyDialog::rejected,this,[=](){
        qDebug()<<"rejected 信号被发射了...";
    });

    //模态阻塞
    int ret = dlg.exec();
    if(ret == QDialog::Accepted)
    {
        qDebug()<<"accept button clicked...";
    }
    else if(ret == QDialog::Rejected)
    {
        qDebug()<<"reject button clicked...";
    }
    else
    {
        qDebug()<<"done button clicked...";
    }
}

注意:MyDialog dlg;定义在栈上,exec模态弹出;不要new,避免内存泄漏。


2、QMessageBox 消息对话框

静态API

API 作用
QMessageBox::about() 关于提示框,仅确定按钮
QMessageBox::critical() 错误弹窗
QMessageBox::information() 普通信息提示
QMessageBox::warning() 警告弹窗
QMessageBox::question() 问答对话框,返回点击按钮枚举

示例代码

#include <QMessageBox>

void MainWindow::on_msgbox_clicked()
{
    QMessageBox::about(this,"about","这是一个简单的消息提示框");
    QMessageBox::critical(this,"critical","这是一个错误对话框‑critical...");

    int ret = QMessageBox::question(this,"question","这是你要保存修改的文件内容吗???",
        QMessageBox::Save | QMessageBox::Cancel,
        QMessageBox::Save);

    if(ret == QMessageBox::Save)
    {
        QMessageBox::information(this,"information","恭喜你保存成功!");
    }
    else if(ret == QMessageBox::Cancel)
    {
        QMessageBox::warning(this,"warning","很遗憾保存失败*");
    }
}

3、QFileDialog 文件对话框

全部静态函数;用户点击取消返回空字符串,业务代码要判空。

API 功能
getExistingDirectory() 选择文件夹
getOpenFileName() 选择单个文件
getOpenFileNames() 多选文件,返回QStringList
getSaveFileName() 保存文件对话框

过滤器语法:"Images (*.png *.jpg);;Text files (*.txt)",;;分隔不同过滤项

示例代码

#include <QFileDialog>
#include <QMessageBox>
#include <QStringList>

void MainWindow::on_filedlg_clicked()
{
#ifdef OPENDIR
    //打开目录
    QString dirName = QFileDialog::getExistingDirectory(this,"打开目录","D:\\qw");
    QMessageBox::information(this,"打开目录","你打开的目录是:"+dirName);
#endif

#ifdef OPENFILE
    //打开单个文件
    QString arg("Text files (*.txt)");
    QString fileName = QFileDialog::getOpenFileName(
        this,tr("Open File"),"D:\\qw",
        tr("Images (*.png *.jpg);;Text files (*.txt)"),&arg);
    QMessageBox::information(this,"打开文件","你打开的文件是:"+fileName);
#endif

#ifdef OPENFILES
    //打开多个文件
    QStringList fileNames = QFileDialog::getOpenFileNames(
        this,tr("Open File"),"D:\\qw",
        tr("Images (*.png *.jpg);;Text files (*.txt)"));
    QString names;
    for(int i=0;i<fileNames.size();i++)
    {
        names += fileNames.at(i)+" ";
    }
    QMessageBox::information(this,"打开文件(s)","你打开的文件(s): "+names);
#endif

#ifdef SAVEFILE
    //保存文件
    QString fileName = QFileDialog::getSaveFileName(this,"保存文件","D:\\qw");
    QMessageBox::information(this,"保存文件","你保存的文件:"+fileName);
#endif
}

面试要点总结

  1. exec()模态对话框,阻塞执行;accept/reject/done控制关闭和返回值。
  2. finished(int)信号无论确认、取消、自定义关闭一定会触发。
  3. QFileDialog 用户点取消返回空字符串,业务代码必须做判空。
  4. 文件过滤器用;;分割多种文件类型。
  5. QMessageBox::question()可以组合多个按钮枚举,返回点击按钮。
posted on 2026-08-31 22:07  SobNov  阅读(3)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3