【Qt】Qt窗口 | QDialog 对话框

文章目录

  • [一. 对话框](#一. 对话框)
  • [二. 对话框的分类](#二. 对话框的分类)
    • [1. 非模态对话框](#1. 非模态对话框)
    • [2. 模态对话框](#2. 模态对话框)
    • [3. 混合属性对话框](#3. 混合属性对话框)
  • [三. 自定义对话框](#三. 自定义对话框)
    • [1. 代码实现](#1. 代码实现)
    • [2. ui文件实现](#2. ui文件实现)
  • [四. 内置对话框](#四. 内置对话框)
    • [1. QMessageBox 消息对话框](#1. QMessageBox 消息对话框)
    • [2. QColorDialog 颜色对话框](#2. QColorDialog 颜色对话框)
    • [3. QFileDialog 文件对话框](#3. QFileDialog 文件对话框)
    • [4. QFontDialog 字体对话框](#4. QFontDialog 字体对话框)
    • [5. QInputDialog 输入对话框](#5. QInputDialog 输入对话框)

一. 对话框

一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口,出现在程序最上层,用于实现短期任务或者简洁的用户交互

Qt 常用的内置对话框有:

  • QMessageBox (消息框)
  • QFileDialog (文件对话框)
  • QInputDialog (输入对话框)
  • QFontDialog (字体对话框)
  • QColorDiaglog (颜色对话框)

二. 对话框的分类

对话框分为 模态对话框非模态对话框

model(bool)属性表示,true为模态,false为非模态

1. 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互 ,是一种非阻塞式对话框,使用 QDialog::show() 函数调用

非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等

非模态对话框一般在堆上创建,这是因为如果创建在栈上时,弹出的非模态对话框就会一闪而过。因为是在堆上创建,所以需要手动释放,Qt提供 Qt::WA_DeleteOnClose 属性,实现在点击"关闭"按钮后,释放内存空间

代码示例:在窗口添加一个按钮,点击按钮创建对话框
点击按钮的槽函数

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    //堆上创建
    QDialog *dialog = new QDialog(this);
    //设置关闭释放
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    //dialog->setModel(false);//也可以设置非模态
    dialog->show();//非模态对话框显示
}

运行结果如下: 弹出对话框后,仍然可以跟父窗口互动,继续创建对话框


2. 模态对话框

模态对话框:显示后无法与父窗口进行交互,是一种阻塞式的对话框 ,通过 QDialog::exec() 函数调用

模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等

因为模态对话框是阻塞式的,所以在完成交互前,无法与父窗口互动,所以不需要在堆上创建,使用栈对象即可

代码示例:在窗口添加一个按钮,点击按钮创建对话框
点击按钮的槽函数

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    //模态对话框
    QDialog dialog(this);
    //dialog.setModal(true);//也可以设置模态
    dialog.exec();//模态对话框显示
}

运行结果如下: 弹出对话框后,无法与父窗口互动

3. 混合属性对话框

混合属性对话框同时具有 模态对话框非模态对话框 的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框属性

使用 QDialog::setModal() 函数创建混合属性的对话框。通常,创建对话框时需要指定对话框的父组件

代码示例:

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    //混合属性对话框
    QDialog *dialog = new QDialog(this);//堆上创建
    dialog->setAttribute(Qt::WA_DeleteOnClose);//设置关闭释放
    dialog->setModal(true);//设置模态属性
    dialog->resize(500, 300);//调整大小
    dialog->show();//显示
}

运行结果如下:

三. 自定义对话框

自定义对话框主要通过 继承 QDialog类 ,并扩展所需功能

方法有两种:代码实现ui文件实现

1. 代码实现

创建新的类,并继承自 QDialog类,如此既可以使用对话框的功能,也可以为对话框添加控件,布局等

  1. 创建新类
  2. 填写类名、父类等信息
  3. Dialog自定义类 中构建界面 dialog.cpp
cpp 复制代码
Dialog::Dialog(QWidget* parent):QDialog(parent)
{
    //布局管理器
    QVBoxLayout *layout = new QVBoxLayout(this);
    //要添加的控件
    QPushButton *button = new QPushButton("关闭");
    connect(button, &QPushButton::clicked, this, &Dialog::closeDialog);
    QLabel *label = new QLabel("自定义对话框");
    //将控件添加到布局管理器
    layout->addWidget(label);
    layout->addWidget(button);
    //设置布局管理器
    this->setLayout(layout);
}

void Dialog::closeDialog()
{
    this->close();
}
  1. 在主窗口添加按钮,点击按钮弹出自定义对话框
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    Dialog *dialog = new Dialog(this);
    dialog->resize(300, 200);
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    dialog->show();//显示对话框
}

运行结果如下:


2. ui文件实现

ui文件 本质也是新建类,并继承自 QDialog,不过可以使用Qt Designer 通过图形化方式,快速布局

  1. 添加 ui文件
  2. 选择 ui文件 类型
  3. 通过 Qt Designer 设计界面
  4. 编写相关按钮的槽函数,大体与 代码实现 相似

运行结果如下:


四. 内置对话框

1. QMessageBox 消息对话框

消息对话框是应用程序中最常用的界面元素,是一种用于向用户显示信息、警告或错误的窗口。

QMessageBox类 中定义了静态成员函数,可以直接调用创建不同风格的消息对话框

静态成员函数 说明
Question 用于正常操作过程中的提问
Information 用于报告正常运行信息
Warning 用于报告非关键错误
Critical 用于报告严重错误

常用API

API 说明
void setWindowTitle(const QString &title) 设置消息对话框标题
void setText(const QString &text) 设置消息对话框文本
void setIcon(QMessageBox::Icon) 设置消息对话框图标及类型
void setStandardButtons(QMessageBox::StandardButtons buttons) 设置消息框按钮

消息对话框图标及类型为上述四种类型
常用消息框按钮类型如下:

  • QMessageBox::Ok
  • QMessageBox::Open
  • QMessageBox::Save
  • QMessageBox::Cancel
  • QMeesgaeBox::Close
  • QMessageBox::Apply
  • QMessageBox::Reset
  • QMessageBox::Help
  • QMessageBox::Yes
  • QMessageBox::No

这些类型本质是对整数的宏替换


代码示例:主窗口有一个按钮,点击弹出 Question消息对话框

主窗口按钮的槽函数

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QMessageBox *messageBox = new QMessageBox();
    messageBox->setWindowTitle("Question Message");//设置消息框标题
    messageBox->setText("Are you ok???");//设置消息框文本
    messageBox->setIcon(QMessageBox::Question);//设置图标
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Close);//设置按钮
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->show();
}

运行结果如下:


QMessageBox类 除了使用上述内置的按钮,还可以添加自定义按钮,方法如下:
void addButton(QAbstractButton *button, QMessageBox::Button Role role);

第一个参数是自定义按钮,第二个参数是该按钮的作用,常用类型如下:

类型 描述
QMessageBox::InvalidRole -1 按钮无效
QMessageBox::AcceptRole 0 点击按钮,接受对话框
QMessageBox::RejectRole 1 点击按钮,拒绝对话框
QMessageBox::DestructiveRole 2 点击按钮,析构并关闭对话框
QMessageBox::HelpRole 4 点击按钮,请求帮助

Qt 内置的按钮,无法进行信号槽连接

自定义按钮,则可以使用信号槽机制

代码示例:自定义按钮添加至消息对话框

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QMessageBox *messageBox = new QMessageBox();
    messageBox->setWindowTitle("Question Message");//设置消息框标题
    messageBox->setText("Are you ok???");//设置消息框文本
    messageBox->setIcon(QMessageBox::Question);//设置图标
    //自定义按钮
    QPushButton *button = new QPushButton("保存");
    messageBox->addButton(button, QMessageBox::AcceptRole);
    connect(button, &QPushButton::clicked, this, [](){
         qDebug() << "保存信息";
    });
    //设置关闭释放
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    messageBox->show();
}

运行结果如下:


使用 QMessageBox 内置的按钮,可以在调用 exec() 后获取用户选择

exec() 返回值为整数,可以与 standardButton枚举类 匹配

代码示例:获取用户对消息对话框的选择

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QMessageBox *messageBox = new QMessageBox();
    messageBox->setWindowTitle("Warning Message");//设置消息框标题
    messageBox->setText("Error Warning");//设置消息框文本
    messageBox->setIcon(QMessageBox::Warning);//设置图标
    messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Help | QMessageBox::Close);//设置按钮
    //设置关闭释放
    messageBox->setAttribute(Qt::WA_DeleteOnClose);
    //获取用户选择
    int ret = messageBox->exec();
    if(ret == QMessageBox::Ok)
        qDebug() << "用户选择Ok";
    else if(ret == QMessageBox::Help)
        qDebug() << "用户选择Help";
    else if(ret == QMessageBox::Close)
        qDebug() << "用户选择Close";
}

运行结果如下:


QMessageBox 还提供静态成员函数,直接创建对话框,方便使用

举例:warning,函数原型如下:

参数说明:

  • parent:父对象
  • title:对话框标题
  • text:对话框文本
  • buttons:按钮类型
  • defaultButton:默认按钮类型
    示例:
cpp 复制代码
//静态成员函数
auto ret = QMessageBox::warning(this, "警告", "错误信息警告", QMessageBox::Ok | QMessageBox::Close);
if(ret == QMessageBox::Ok)
    qDebug () << "Ok";
else
    qDebug() << "Close";

2. QColorDialog 颜色对话框

QColorDialog类 提供一个标准的颜色选择对话框,用户可以从中选择颜色 ,并且可以自定义颜色和编辑颜色


常用API

API 说明
QColorDialog(const QColor &initial, QWidget *parent = nullptr) 创建对象,initial指定默认颜色,parent指明父对象
void setCurrentColor(const QColor &color) 设置当前颜色的对话框
QColor currentColor() 获取当前对话框选择的颜色
void open(QObject *receiver, const char *member) 打开颜色对话框

QColorDialog类 同样也提供静态成员函数,帮助快速创建颜色对话框,获取颜色

  • initial:设置默认颜色
  • parent:设置父对象
  • title:设置对话框标题
  • options:设置选项

QColor 使用的是 ARGBA为alpha(不透明度),RGB分别为Red,Green,Blue数值为0 ~ 1类似百分比,对应0 ~ 255

代码示例:点击主窗口按钮,弹出颜色对话框,通过颜色对话框更改窗口背景色
主窗口按钮槽函数

cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    QColor color = QColorDialog::getColor(QColor(255, 0, 0), this, "选择背景颜色");
    qDebug() << "你选择:" << color;
    //使用QSS设置
    char style[1024];
    snprintf(style, sizeof(style), "background-color:rgb(%d, %d, %d);", color.red(), color.green(), color.blue());
    this->setStyleSheet(style);
}

运行结果如下:


3. QFileDialog 文件对话框

QFileDialog类 用于显示文件选择对话框,让用户选择文件或目录,用于应用程序中需要打开一个外部文件或需要将当前内容存储到指定的外部文件

常用API

API 说明
QString getOpenFileName() 获取要打开的文件的文件名,一次打开一个文件
QStringList getOpenFileNames() 一次可以打开多个文件
QString getSaveFileName 将当前内容存储到指定的外部文件

上述三个函数既有普通成员函数,也有静态成员函数,参数大体相同,此处举例 getOpenFileName(),函数原型如下:

参数说明:

  • parent:父对象
  • caption:对话框标题
  • dir:默认打开的路径
  • filter:文件过滤器

上述方法都只是获取文件路径,没有对文件的实质性操作


代码示例:点击按钮,弹出文件对话框,选择要打开的文件

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *button = new QPushButton("打开文件", this);
    //连接信号槽
    connect(button, &QPushButton::clicked, this, [=](){
       QString filepath = QFileDialog::getOpenFileName(this,         //父对象
                                                       "打开文件",    //对话框标题
                                                       "C:/Users/Lenovo/Desktop/code/icon/",  //要打开的文件路径
                                                       "*.png");     //只留下.png后缀的文件
       qDebug() << filepath;
    });
}

运行结果如下:

4. QFontDialog 字体对话框

QFontDialog类 用于显示字体选择对话框的类,允许用户选择字体、样式和大小等

其常用静态成员函数为 getFont(),其函数原型如下:

  • ok:ok是输入输出型参数。文本对话框有两个按钮(OK和Cancel),选择OK,ok会变成true,选择Cancel,ok会变成false
  • initial:默认的字体
  • parent:父对象
  • title:对话框标题

代码示例:点击主窗口按钮,弹出文本对话框,选择字体,修改按钮文本的字体

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QPushButton *button = new QPushButton("弹出文本对话框", this);
    button->resize(200, 80);
    //连接信号槽
    connect(button, &QPushButton::clicked, this, [=](){
        bool flag = false;
        QFont font = QFontDialog::getFont(&flag, QFont("宋体", 36), this, "选择文本");
        //打印字体信息
        qDebug() << font.family();
        qDebug() << "字体大小:" << font.pointSize();
        qDebug() << "是否加粗:" << font.bold();
        qDebug() << "是否斜体:" << font.italic();
        //设置按钮字体
        button->setFont(font);
    });
}

运行结果如下:


5. QInputDialog 输入对话框

QInputDialog 是一个用于获取用户输入的对话框,可以让用户输入文本、选择数字

常用API
整型输入对话框

  1. parent:父对象
  2. title:对话框标题
  3. label:对话框文本
  4. value:初始值
  5. min:最小值
  6. max:最大值
  7. step:微调框的步长
  8. ok:输入输出型参数,选择OK为true,选择Cancel为false

双精度浮点型输入对话框

只有 decimals 是新增的参数,其他参数用法与整形输入框相同

  1. decimals:控制小数的最大位数

选择条目型输入对话框

前三个参数用法相同

  • items:下拉框的内容
  • current:初始选择条目的下标
  • editable:是否允许输入
  • ok:选择OK为true,选择Cancel为false

代码示例:主窗口点击按钮,弹出选择条目型对话框,选择汉堡

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton *button = new QPushButton("弹出对话框", this);
    button->resize(200, 100);
    connect(button, &QPushButton::clicked, this, [=](){
        //下拉框条目
        QStringList hamburgs = {"香辣鸡腿堡", "巨无霸", "奥尔良鸡腿堡"};
        bool flag = false;
        //获取选择
        QString item = QInputDialog::getItem(this, "选择汉堡", "请选择:", hamburgs, 0, true, &flag);
        if(flag)
            qDebug() << "您选择:" << item;
        else
            qDebug() << "请重新选择";
    });
}

运行结果如下:

结束语

感谢你的阅读

如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。

相关推荐
可均可可6 分钟前
C++之OpenCV入门到提高004:Mat 对象的使用
c++·opencv·mat·imread·imwrite
杨荧21 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰28 分钟前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
小芒果_0132 分钟前
P11229 [CSP-J 2024] 小木棍
c++·算法·信息学奥赛
gkdpjj38 分钟前
C++优选算法十 哈希表
c++·算法·散列表
王俊山IT40 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。42 分钟前
c++多线程
java·开发语言
-Even-42 分钟前
【第六章】分支语句和逻辑运算符
c++·c++ primer plus
小政爱学习!44 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript