首页 > 其他分享 >【Qt】Qt窗口 | QDialog 对话框

【Qt】Qt窗口 | QDialog 对话框

时间:2024-08-23 14:24:15浏览次数:6  
标签:模态 messageBox Qt 对话框 QDialog QMessageBox 按钮 MainWindow

文章目录

一. 对话框

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

  • QMessageBox (消息框)
  • QFileDialog (文件对话框)
  • QInputDialog (输入对话框)
  • QFontDialog (字体对话框)
  • QColorDiaglog (颜色对话框)
    在这里插入图片描述

二. 对话框的分类

对话框分为 模态对话框非模态对话框
model(bool)属性表示,true为模态,false为非模态

1. 非模态对话框

非模态对话框显示后独立存在,可以同时与父窗口进行交互,是一种非阻塞式对话框,使用 QDialog::show() 函数调用
非模态对话框适用于特殊功能设置的场合,比如查找操作,属性设置等

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

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

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

运行结果如下: 弹出对话框后,仍然可以跟父窗口互动,继续创建对话框
在这里插入图片描述


2. 模态对话框

模态对话框:显示后无法与父窗口进行交互,是一种阻塞式的对话框,通过 QDialog::exec() 函数调用
模态对话框适用于必须依赖用户选择的场合,比如消息显示,文件选择,打印设置等

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

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

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

运行结果如下: 弹出对话框后,无法与父窗口互动
在这里插入图片描述

3. 混合属性对话框

混合属性对话框同时具有 模态对话框非模态对话框 的属性,对话框的生成和销毁具有非模态对话框属性,功能上具有模态对话框属性
使用 QDialog::setModal() 函数创建混合属性的对话框。通常,创建对话框时需要指定对话框的父组件

代码示例:

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
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. 在主窗口添加按钮,点击按钮弹出自定义对话框
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消息对话框

主窗口按钮的槽函数

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::AcceptRole0点击按钮,接受对话框
QMessageBox::RejectRole1点击按钮,拒绝对话框
QMessageBox::DestructiveRole2点击按钮,析构并关闭对话框
QMessageBox::HelpRole4点击按钮,请求帮助

Qt 内置的按钮,无法进行信号槽连接
自定义按钮,则可以使用信号槽机制

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

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枚举类 匹配

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

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:默认按钮类型
    示例:
//静态成员函数
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

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

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:文件过滤器

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


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

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:对话框标题

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

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

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

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() << "请重新选择";
    });
}

运行结果如下:
在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

标签:模态,messageBox,Qt,对话框,QDialog,QMessageBox,按钮,MainWindow
From: https://blog.csdn.net/m0_72563041/article/details/141269587

相关文章

  • Qt5.14.2 多边形与多边形求交集
    利用Qt5.14.2中自带的QPolygonF类的intersected()函数求两个多边形的交集多边形。inlineQList<QPolygonF>getPolygonIntersectedWithPolygon(QPolygonFpolygon1,QPolygonFpolygon2){QList<QPolygonF>outval;//此处求出的intersection可能包含多个子......
  • qt5.14.2 MSVC opencv(不结合vs)路径添加问题 测试通过
     不换行写法1win32:CONFIG(release,debug|release):LIBS+=-LG:/opencv4.4.0/opencv4.4_vs_msvc19_qt6.5/x64/vc17/lib/-lopencv_aruco440-lopencv_bgsegm440-lopencv_bioinspired440-lopencv_calib3d440-lopencv_ccalib440-lopencv_core440-lopencv_cvv440-lopen......
  • Qt5.14.2 MinGW7.3.0_64 opencv helloworld
    路径配置.proINCLUDEPATH+=E:\Opencv\includeLIBS+=E:\Opencv\x64\mingw\lib\libopencv_*.a 点击按钮打开一张图片1#include"mainwindow.h"2#include"ui_mainwindow.h"3#include<QFileDialog>4#include<QMessageBox>5......
  • PyQt5简介
    PyQt是Qt框架的Python语言实现,由RiverbankComputing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏。PyQt5提供GPL版和商业版证书,自由开发者可以使用......
  • Qt Line Edit焦点丢失|Checkbox转移焦点丢失
    在我设计的一个界面中,用事件过滤器获取键盘方向键,通过键盘方向键转移控件的焦点,获取焦点的控件显示高亮,在从一个Checkbox控件转移焦点到一个LineEdit控件的时候,该获得焦点的控件并没有显示高亮,并且根据后续操作推测焦点消失了,通过qDebug调试发现转移焦点后的那一瞬间,LineEdit控......
  • Qt:Qt背景
    目录1.Qt解释2.Windows下开发GUI的方案3.框架4.Qt历史4.Qt支持的平台5.Qt版本6.Qt案例1.Qt解释        前端开发,分为网页前端开发(Web)、桌面应用开发(Windows、Linux)、移动应用开发(Android)。Qt一般用于客户端开发,这里的客户端是狭义的,指桌面应用开发。  ......
  • QT+OpenGL简单纹理贴图
    一、概述之前的文章都是绘制一些纯色的三角形和正方形以及控制他们的相对位置。在实际的开发中一般都需要给绘制出的图形贴上漂亮的纹理。纹理贴图步骤:1.创建纹理glGenTextures(1,&texture);//参数1:创建纹理的数量,参数2:用户定义的纹理id,一般为unsignedint......
  • QT+OpenGL从顶点着色器传递颜色数据给片元着色器
    一、概述目的:1.定义顶点数据和颜色数据,并将颜色数据通过顶点着色器传递给片元着色器2.对定义的三角形动态进行:平移、颠倒、镜像二、示例代码1.定义顶点坐标和颜色值。此处颜色和顶点是放到一块的。需要告知GPU如何解析数据,如:哪些是顶点,哪......
  • Qt键盘事件检测不到方向键|阻止控件截取键盘事件
    做项目二次开发的时候遇到一个问题,在自己新建的界面中放了很多控件,需要通过键盘方向键来控制焦点在不同控件间的转移,之前用键盘事件检测上下键没有问题,后来加上左右键发现没有反应,查了资料了解到是控件吞掉了左右方向键的信号,因为Qt中本身就有一些处理事件的函数,控件会获取键盘左......
  • QT+OpenGL通过两个VAO来管理两个三角形
    一、概述需求:通过两个VAO来管理VBO,从而控制两个三角形此需求和单独通过VAO绘制一个三角形有较大的不同,此处创建两个VAO,同时需要管理两个VBO。在绘制图形的时候需要分别绑定这两个VAO才能正确的绘制出三角形。效果:二、代码示例1.定义顶点数据(两个三角形......