【Qt】对话框

目录

一.什么是对话框

二.对话框的分类

1.模态和非模态对话框

1.1模态对话框

1.2非模态对话框

1.2.1非模态窗口闪退问题

2.混合属性对话框

3.Qt内置对话框

三.创建自定义对话框

1.代码方式实现

[1.1 创建QMainWindow窗口](#1.1 创建QMainWindow窗口)

[1.2 添加按钮来触发对话框](#1.2 添加按钮来触发对话框)

[1.3 创建C++类(Dialog类)](#1.3 创建C++类(Dialog类))

[1.4 编写按钮槽函数](#1.4 编写按钮槽函数)

[1.5 对子窗口添加控件](#1.5 对子窗口添加控件)

2.图形化实现


一.什么是对话框

对话框是 GUI 程序中不可或缺的组成部分。⼀些不适合在主窗⼝实现的功能组件可以设置在对话框 中。对话框通常是⼀个顶层窗⼝,出现在程序最上层,⽤于实现短期任务或者简洁的⽤⼾交互。

目的:与用户进行短平快的交互

二.对话框的分类

1.模态和非模态对话框

两种对话框区别是打开后还能否与其他窗口交互

1.1模态对话框

**在对话框打开时,用户只能与对话框进行交互,而不能与其他窗口进行交互,直到对话框关闭。**模态对话框会阻塞程序的执行,直到用户对对话框进行操作并关闭对话框。

使⽤QDialog::exec() 函 数调⽤。

1.2非模态对话框

**非模态对话框是指在对话框打开时,用户可以同时与对话框和其他窗口进行交互,不会阻塞程序的执行。**非模态对话框允许用户在对话框打开的同时执行其他操作,而不需要等待对话框关闭。

使⽤ QDialog::show()函数调⽤。

1.2.1非模态窗口闪退问题

问题:Qt创建一个子窗口时,发现窗口创建后会闪退。
原因:

①为窗口创建在栈上时,是局部变量。

②show()函数是非阻塞方式运行窗口,窗口创建后代码继续运行而退出函数,函数退出后直接销毁其中的局部变量,导致窗口显示后直接被销毁,闪退
解决方案:

对于qt的三种窗口,QWidget、QMainWindow、QDialog

QDialog可以使用函数exec()来阻塞式显示窗口,这样直到窗口被关闭才会继续运行后续代码退出函数。

而对于QWidget与QMainWindow(继承于QWidget),可以使用new,将对话框创建在堆上。

⾮模态对话框⼀般在堆上创建,此时我们需要设置 Qt:WA_DeleteOnClose 属性,⽬的是:当创建多个⾮模态对话框时(如打开了多个⾮ 模态窗⼝),为了避免内存泄漏。

eg:

cpp 复制代码
 QPushButton* btn=new QPushButton(this);

   btn->setText("button");
   
   connect(btn,&QPushButton::clicked,[=](){
       // 非模态对话框
        QDialog* dlg=new QDialog(this);

        dlg->resize(200,200);

        dlg->setAttribute(Qt::WA_DeleteOnClose);

        dlg->show();

2.混合属性对话框

混合属性对话框(Mixed Attribute Dialog)是指同时具有模态和非模态特性的对话框。它能在对话框显示期间阻塞其所属窗口上的其他操作,但又可以供用户继续操作其他非对话框部件。

3.Qt内置对话框

在Qt中存在许多自带的对话框,Qt 提供了多种可复⽤的对话框类型,即 Qt 标准对话框。Qt 标准对话框全部继承于QDialog类。

内置对话框 说明

QMessageBox 用于显示消息、警告、错误等信息的对话框。

QInputDialog 用于获取用户输入的对话框,可以用于获取文本、整数、浮点数等类型的输入。

QColorDialog 用于选择颜色的对话框。

QFileDialog 用于选择文件或目录的对话框。

QFontDialog 用于选择字体的对话框。

QProgressDialog 用于显示进度条的对话框。

QPrintDialog 用于打印文档的对话框。

QPageSetupDialog 用于设置页面布局的对话框。

在下一节我们会详细介绍内置对话框。

三.创建自定义对话框

1.代码方式实现

1.1 创建QMainWindow窗口
1.2 添加按钮来触发对话框

在QMainWindow窗口上,创建一个打开窗口的按钮

cpp 复制代码
//mainwindow.cpp
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建一个按钮
    QPushButton* button = new QPushButton("open window btn",this);
    //设置按钮的大小
    button->resize(300,100);
    //移动按钮位置
    button->move(250,200);
    //按钮信号点击触发槽函数
    connect(button,&QPushButton::clicked,this,&MainWindow::handle);
}

声明槽函数

cpp 复制代码
//mainwindow.h
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    //声明槽函数
    void handle();

private:
    Ui::MainWindow *ui;
};

运行结果:

1.3 创建C++类(Dialog类)

创建一个新的类,类名为Dialog,继承QDialog类。

​对dialog.h和dialog.cpp进行修改​​​​​​

cpp 复制代码
//dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);
};

#endif // DIALOG_H
cpp 复制代码
//dialog.cpp
#include "dialog.h"

Dialog::Dialog(QWidget* parent) : QDialog(parent)
{

}
1.4 编写按钮槽函数
cpp 复制代码
void MainWindow::handle()
{
    //创建一个对话框
    Dialog * dialog = new Dialog(this);
    //设置窗口的大小
    dialog->resize(300,180);
    //设置窗口关闭
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    //显示窗口
    dialog->show();
}
1.5 对子窗口添加控件
cpp 复制代码
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>

class Dialog : public QDialog
{
    Q_OBJECT
public:
    Dialog(QWidget* parent);
    void buttonclose();
};

#endif // DIALOG_H
cpp 复制代码
dialog.cpp
#include "dialog.h"
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>
Dialog::Dialog(QWidget* parent) : QDialog(parent)
{
    //创建垂直布局
    QVBoxLayout* layout = new QVBoxLayout();
    this->setLayout(layout);
    //创建标签和按钮
    QLabel * label = new QLabel("This is a window",this);
    QPushButton* button = new QPushButton("close",this);
    //将控件添加进布局中
    layout->addWidget(label);
    layout->addWidget(button);
    //进行按钮槽函数链接
    connect(button,&QPushButton::clicked,this,&Dialog::buttonclose);

}

void Dialog::buttonclose()
{
	//关闭子窗口
    this->close();
}

运行结果:

2.图形化实现

2.1创建QMainWindow窗口
2.2 创建一个按钮控件

在界面中拖拽进一个PushButton控件

2.3 新建一个ui文件
2.4 在界面中创建按钮和标签
2.5 编写创建按钮的槽函数
cpp 复制代码
void MainWindow::on_pushButton_clicked()
{
    //创建窗口
    Dialog* dialog = new Dialog(this);
    //关闭窗口释放内存
    dialog->setAttribute(Qt::WA_DeleteOnClose);
    //展示窗口
    dialog->show();
}
2.6 编写关闭按钮槽函数
cpp 复制代码
void Dialog::on_pushButton_clicked()
{
    //关闭窗口
    this->close();
}

运行结果:

原文链接:http://t.csdnimg.cn/mqmWv

相关推荐
Mr.Lu ‍5 小时前
QT调试查看QT内部数据时显示无可用信息,未为 Qt5Cored.dll 加载任何符号
开发语言·qt
AI算法沐枫6 小时前
基于YOLO26深度学习的【果园荔枝检测与计数】系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
开发语言·人工智能·python·深度学习·qt·学习·机器学习
Cx330❀7 小时前
【Qt 核心机制篇】深度解析 Qt 信号与槽(Signals & Slots)机制:从底层原理、实战演练到 Lambda 进阶
linux·开发语言·c++·人工智能·qt·ubuntu
学习,学习,在学习7 小时前
Modbus TCP同步通信方式实现异步级效率
网络·c++·qt·网络协议·tcp/ip·qt5
eggcode16 小时前
【Qt学习】Linux(ARM架构)在线安装Qt6.x
linux·qt·学习·arm
似水এ᭄往昔1 天前
【Qt】--Qt概述
开发语言·c++·qt
人还是要有梦想的1 天前
Qt WebEngine需要MSVC进行编译运行,QT如何用MSVC编译(包含64位和32位)
开发语言·qt·msvc
程序leo源1 天前
Qt界面优化详解
linux·c语言·开发语言·c++·qt·c#
郝学胜-神的一滴1 天前
Qt 高级开发 017:中文乱码
开发语言·c++·qt·程序人生·用户界面
誰能久伴不乏1 天前
【Qt 架构实战】从零手写工业级 Qt 日志系统:底层拦截与架构原理解析
qt·架构·日志