Qt对话框

文章目录

  • 创建普通的对话框
  • 对话框的内存泄露问题
  • 自定义对话框
  • 模态式对话框
  • QMessageBox(消息对话框)
    • 对话框类型
    • 对话框按钮
    • 接收对话框返回值
    • 演示
    • 其他创建方式
  • QColorDialog(颜色对话框)
    • 案例
  • QFileDialog(文件对话框)
    • 案例
  • QFontDialog(字体对话框)
    • 案例
  • QInputDialog(输入对话框)
    • 案例

img

  • QFiledialog:文件对话框
  • QColorDialog:颜色对话框
  • QFontDialog:字体对话框
  • QInputDialog:输入对话框
  • QMessageBox:消息框

创建普通的对话框

实现点击按钮后弹出对话框

// 创建一个按钮,点击之后弹出对话框
QPushButton *b = new QPushButton(this);
b->setText("弹出对话框"); b->move(350, 300);// 设置按钮的槽函数
connect(b, &QPushButton::clicked, this, [=](){// 创建对话框QDialog *d = new QDialog(this);// 设置对话框尺寸d->resize(200, 200);// 通过 show 方法显示对话框d->show();
});

img

对话框的内存泄露问题

上述的方式其实会有内存泄漏的问题。

首先按钮点击的槽函数是在堆上创建一个新的对话框对象,并且在函数执行完之后并没有释放掉这个对象,虽然这个对话框对象是挂在了父窗口上的。但难免会有些场景下,在没有关闭窗口的时候创建了很多个对话框对象都没有释放,那就很可以能会导致内存不够程序崩溃。

为了解决这个问题,就必须要在关闭对话框的时候将这个对象释放掉。先来看一种情况:直接在对话框弹出后就 delete 掉。

// 设置按钮的槽函数
connect(b, &QPushButton::clicked, this, [=](){// 创建对话框QDialog *d = new QDialog(this);// 设置对话框尺寸d->resize(200, 200);// 通过 show 方法显示对话框d->show();delete d;
});

img

这样子写就会导致对话框直接就释放掉了,根本没有操作的时间。所以就得在对话框关闭时才释放对象。

因此为了解决这种情况,Qt的对话框内置了一个属性,Qt::WA_DeleteOnClose 这个属性设置了之后,对话框对象就会在关闭对话框的时候释放掉,非常的方便。

// 设置按钮的槽函数
connect(b, &QPushButton::clicked, this, [=](){// 创建对话框QDialog *d = new QDialog(this);// 设置对话框尺寸d->resize(200, 200);// 通过 show 方法显示对话框d->show();d->setAttribute(Qt::WA_DeleteOnClose);
});

img

自定义对话框

想要在主窗口上的对话框添加内容,就需要新建一个类继承 QDialog 类,然后在新建类上操作。

有两种方法,纯代码编写和 ui 界面编写,这里以纯代码演示。

先来看看项目结构

img

接下来就可以在 mydialog.cpp 文件中编写 MyDialog 类的构造函数从而实现添加一些内容。

首先编写 mydialog.cpp 实现对话框内容

#include "mydialog.h"
#include "ui_mydialog.h"#include <QVBoxLayout>
#include <QLabel>
#include <QPushButton>MyDialog::MyDialog(QWidget *parent) :QDialog(parent),ui(new Ui::MyDialog)
{ui->setupUi(this);// 创建一个布局管理器QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);// 添加一些控件QLabel* label = new QLabel("这是一个对话框", this);QPushButton* button = new QPushButton("关闭", this);layout->addWidget(label);layout->addWidget(button);// 实现按钮点击就关闭对话框connect(button, &QPushButton::clicked, this, [=](){this->close();});
}MyDialog::~MyDialog()
{delete ui;
}

接着编写主窗口,实现按钮点击弹出对话框,注意此时创建的对话框类型就不是内置的 QDialog 了,而是我们自己新建的对话框类

// 创建一个按钮,点击之后弹出对话框
QPushButton *b = new QPushButton(this);
b->setText("弹出对话框"); b->move(350, 300);// 设置按钮的槽函数
connect(b, &QPushButton::clicked, this, [=](){// 创建对话框MyDialog *d = new MyDialog(this);// 设置对话框尺寸d->resize(200, 200);// 通过 show 方法显示对话框d->show();d->setAttribute(Qt::WA_DeleteOnClose);

看看效果:

img

模态式对话框

模态:对话框显示后,除非关闭对话框,否则无法再操作父窗口,属于阻塞式对话框

非模态:对话框显示后可以继续操作父窗口,属于非阻塞式对话框

非模态效果:

img

模态效果:

img

非模态和模态的设置就是在对话框对象调用显示函数的不同

  • 模态:调用 exec 函数显示
  • 非模态:调用 show 函数显示

QMessageBox(消息对话框)

消息对话框是应用程序中最常用的界面元素。消息对话框主要用于为用户提示重要信息,强制用户进行选择操作。

对话框类型

消息对话框是需要设置类型的,例如:警告、错误等类型。可以通过 setIcon 方法去设置类型,不同的类型会对应出不同的图标。

  • QMessageBox::Question:提问类型
  • QMessageBox::Information:正常运行类型
  • QMessageBox::Warning:警告类型
  • QMessageBox::Critical:错误类型

对话框按钮

Qt 已经为消息对话框内置了许多的按钮类型

img

通过 setStandardButtons 函数就可以设置了。

当然消息对话框也支持添加自定义的按钮控件,并且也可以支持槽函数,但是相对起来使用内置的更方便

接收对话框返回值

当点击了对话框的内置按钮后,会返回这个按钮的类型,是可以被接收到的。

因此利用这个性质,就可以根据接收到的类型去实现相应的业务处理

演示

首先创建一个按钮用于弹出对话框,并创建一个 label 控件显示出点击了对话框后的处理结果

img

编写按钮点击的槽函数代码

void MainWindow::on_pushButton_clicked()
{// 创建消息对话框QMessageBox *msg = new QMessageBox(this);// 设置对话框标题msg->setWindowTitle("警告");// 设置对话框的文本msg->setText("请选择");// 设置对话框类型msg->setIcon(QMessageBox::Warning);// 设置对话框按钮msg->setStandardButtons(QMessageBox::Ok | QMessageBox::Cancel);// 接收对话框的按钮类型int res = msg->exec();// 根据类型显示不同信息if(res == QMessageBox::Ok)ui->label->setText("OK");if(res == QMessageBox::Cancel)ui->label->setText("Cancel");// 设置自动释放属性msg->setAttribute(Qt::WA_DeleteOnClose);
}

img

其他创建方式

在 QMessageBox 中有个静态的函数 information 可以直接创建一个临时的对话框对象,并返回对话框的点击值。非常的方便

static int information(QWidget *parent, const QString &title,const QString& text,int button0, int button1 = 0, int button2 = 0);
  • 参数一:父对象
  • 参数二:对话框标题
  • 参数三:对话框文本
  • 参数四五六:对话框的按钮类型
void MainWindow::on_pushButton_clicked()
{int res = QMessageBox::information(this, "警告", "选择",QMessageBox::Ok | QMessageBox::Cancel);if(res == QMessageBox::Ok)ui->label->setText("OK");if(res == QMessageBox::Cancel)ui->label->setText("Cancel");
}

效果与上述的一样的

QColorDialog(颜色对话框)

这个对话框主要是用来选择颜色的。

主要的方法有:

// 创建对象的同时设置父对象
QColorDialog (QWidget *parent = nullptr);
// 创建对象的同时通过QColor 对象设置默认颜色和父对象
QColorDialog(const QColor &initial, QWidget *parent = nullptr);
// 设置当前颜色对话框
void setCurrentColor(const QColor &color);
// 获取当前颜色对话框
QColor currentColor() const;
// 打开颜色选择对话框,并返回一个 QColor 对象
QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions());
  • const QColor &initial:初始化默认颜色
  • QWidget *parent:父对象
  • const QString &title:对话框标题
  • QColorDialog::ColorDialogOptions:对话框的外观和行为

案例

实现一个按钮弹出对话框,接收到QColor 对象后修改 label 的背景颜色

void MainWindow::on_pushButton_clicked()
{// 创建颜色对话框QColorDialog *c = new QColorDialog(this);// 打开对话框设置默认颜色为红色并获取返回的QColor对象QColor res = c->getColor(QColor(255, 0, 0));// 根据获取到的颜色使用QSS改变 label的背景颜色char qss[1024] = {0};sprintf(qss, "background-color: rgb(%d, %d, %d);",res.red(), res.green(), res.blue());ui->label->setStyleSheet(qss);
}

img

QFileDialog(文件对话框)

文件对话框用于应用程序中需要打开⼀个外部文件或需要将当前内容存储到指定的外部文件。

常用方法:

// 一次打开一个文件
QString getOpenFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,QFileDialog::Options options = Options());// 一次打开多个文件
QString getOpenFileNames(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,QFileDialog::Options options = Options());// 保存文件
QString getSaveFileName(QWidget *parent = nullptr, const QString &caption = QString(), const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = nullptr,QFileDialog::Options options = Options());
  • QWidget *parent:父对象
  • const QString &caption:caption 对话框标题
  • const QString &dir:默认打开的路径
  • const QString &filter:文件过滤器

案例

将打开/保存文件的路径打印到 label

img

void MainWindow::on_pushButton_clicked()
{QString filename = QFileDialog::getOpenFileName(this,"打开文件","D:\\","*.png");ui->label->setText(filename);
}void MainWindow::on_pushButton_2_clicked()
{QString filename = QFileDialog::getSaveFileName(this,"保存文件","D:\\","*.txt");ui->label->setText(filename);
}

img

QFontDialog(字体对话框)

用于提供选择字体的对话框

主要方法:

// 打开字体对话框并获取所选择的字体样式
static QFont getFont(bool *ok, const QFont &initial, QWidget *parent = nullptr, const QString &title = QString(),FontDialogOptions options = FontDialogOptions());
  • bool *:输入输出型bool参数
  • const QFont &initial:字体对话框的初始选择

案例

修改 label 的字体为字体对话框中选择的字体样式

void MainWindow::on_pushButton_clicked()
{bool flag;QFont font = QFontDialog::getFont(&flag, QFont("黑体", 10));char qss[1024] = {0};sprintf(qss, "font-family: '%s';font-size: %dpt;", font.family().toUtf8().data(), font.pointSize());ui->label->setStyleSheet(qss);
}

img

QInputDialog(输入对话框)

⽤于进行临时数据输入的场合

常用方法:

// 弹出整形输入对话框,并获取输入的整数
static int getInt(QWidget *parent, const QString &title, const QString &label, int value = 0,int minValue = -2147483647, int maxValue = 2147483647,int step = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
// 弹出浮点型输入对话框,并获取输入的浮点数
static double getDouble(QWidget *parent, const QString &title, const QString &label, double value = 0,double minValue = -2147483647, double maxValue = 2147483647,int decimals = 1, bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags());
// 弹出条目输入对话框,并获取选择的条目
static QString getItem(QWidget *parent, const QString &title, const QString &label,const QStringList &items, int current = 0, bool editable = true,bool *ok = nullptr, Qt::WindowFlags flags = Qt::WindowFlags(),Qt::InputMethodHints inputMethodHints = Qt::ImhNone);

案例

img

void MainWindow::on_pushButton_clicked()
{int result = QInputDialog::getInt(this, "整数", "请输入一个整数: ");ui->label->setText(QString::number(result));
}void MainWindow::on_pushButton_2_clicked()
{double result = QInputDialog::getDouble(this, "浮点数", "请输入一个浮点数: ");ui->label_2->setText(QString::number(result));
}void MainWindow::on_pushButton_3_clicked()
{// 创建条目QStringList items;items.push_back("可乐");items.push_back("雪碧");QString result = QInputDialog::getItem(this, "条目", "请选择: ", items);ui->label_3->setText(result);
}

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824649.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿真测试的应用领域

仿真测试在各种领域中都有广泛的应用&#xff0c;以下是一些应用最广泛的场景&#xff1a; 工业制造&#xff1a;通过模拟制造过程&#xff0c;可以预测产品的质量和性能&#xff0c;优化生产流程&#xff0c;降低成本。航空航天&#xff1a;飞机、导弹、航天器等的设计和研发…

Python - 字符串的应用

字符串格式化问题 使用规则举例: name input("请输入你的名字&#xff1a;") address input("请输入你的住址&#xff1a;") age int(input("请输入你的年龄&#xff1a;")) hobby input("请输入你的爱好&#xff1a;") # %s 字符…

【Android GUI】从总体上了解Android的GUI体系

文章目录 概览Android硬件接口HALGralloc与Framebuffer Gralloc模块的加载Gralloc提供的接口Android原生的Gralloc实现打开framebuffer设备打开gralloc设备 参考 概览 Linux内核提供了统一的framebuffer显示驱动。设备节点/dev/graphics/fb*或者/dev/fb*&#xff0c;其中fb0表示…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧&#xff0c;大多数互联网公司&#xff0c;服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令&#xff0c;在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

Android --- Activity

官方文档-activity Activity 提供窗口&#xff0c;供应在其中多个界面。此窗口通常会填满屏幕&#xff0c;但也可能小于屏幕并浮动在其他窗口之上。 大多数应用包含多个屏幕&#xff0c;这意味着它们包含多个 Activity。通常&#xff0c;应用中的一个 Activity 会被指定主 Ac…

JAVA基础08- 继承,重写,super以及this

目录 继承&#xff08;extends&#xff09; 定义 说明 作用 方法的重写 定义 重写关键点 方法重写与重载的区别 练习 练习1&#xff08;方法继承与重写的简单练习&#xff09; 练习2&#xff08;方法继承与重写的进阶练习&#xff09; This的使用 定义 作用以及注…

基于SpringBoot+Vue的IT技术交流平台(源码+文档+包运行)

一.系统概述 我国科学技术的不断发展&#xff0c;计算机的应用日渐成熟&#xff0c;其强大的功能给人们留下深刻的印象&#xff0c;它已经应用到了人类社会的各个层次的领域&#xff0c;发挥着重要的不可替换的作用。信息管理作为计算机应用的一部分&#xff0c;使用计算机进行…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1&#xff1a; 输入&#xff…

搜维尔科技:【工业仿真】煤矿安全知识基础学习VR系统

产品概述 煤矿安全知识基础学习VR系统 系统内容&#xff1a; 煤矿安全知识基础学习VR系统内容包括&#xff1a;下井流程&#xff08;正确乘坐罐笼、班前会、井下行走注意事项、工作服穿戴、入井检身及人员清点、下井前准备工作、提升运输安全&#xff09;&#xff1b;运煤流程…

SpringBoot集成RockerMQ

1.引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.0</version> </dependency>2.配置服务器地址 #Rocketmq配置 rocketmq.name-server192…

专业清洁工匠服务网站模板 html网站

目录 一.前言 二.页面展示 三.下载链接 一.前言 该HTML代码生成了一个网页&#xff0c;包括以下内容&#xff1a; 头部信息&#xff1a;指定了网页的基本设置和元数据&#xff0c;例如字符编码、视口大小等。CSS文件&#xff1a;引入了多个CSS文件&#xff0c;用于设置网页…

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测

EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测 目录 EI级 | Matlab实现VMD-TCN-LSTM-MATT变分模态分解卷积长短期记忆神经网多头注意力多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实…

动手写sql 《牛客网80道sql》

第1章&#xff1a;SQL编写基础逻辑和常见问题 基础逻辑 SELECT语句: 选择数据表中的列。FROM语句: 指定查询将要从哪个表中检索数据。WHERE语句: 过滤条件&#xff0c;用于提取满足特定条件的记录。GROUP BY语句: 对结果进行分组。HAVING语句: 对分组后的结果进行条件过滤。O…

【STM32】嵌入式实验二 GPIO 实验 (前三个设计)

1&#xff0e; 按键亮灯 设计 GPIO 实验项目 1&#xff0c;功能&#xff1a;当按键 KB1 按下时&#xff0c;实验板上全彩发光二极管周边 的发光二极管全亮&#xff0c;当按键 KB2 按下时跑马灯 D0 闪亮。 实验要求基于寄存器的GPIO配置&#xff0c;所以需要手动操作寄存器来配…

联想小新Air14-2019锐龙版更换硬盘

首先打下D面所有螺丝&#xff08;内六角螺丝&#xff0c;需要准备螺丝刀&#xff09;&#xff0c;然后从下方翘起整个D面打开如下图 原装为2280长度的海力士硬盘&#xff0c;有空余的2242长度硬盘位 更换前断电&#xff0c;建议拆下电池&#xff08;扣下电池排线后不好安装&am…

每日OJ题_完全背包④_力扣279. 完全平方数(一维和二维)

目录 力扣279. 完全平方数 问题解析 解析代码 优化代码&#xff08;相同子问题分析和滚动数组&#xff09; 力扣279. 完全平方数 279. 完全平方数 难度 中等 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值…

百科不全书之 docker记录

docker记录 1 参考文件2. Docker简介与虚拟机的区别 1 参考文件 参考视频&#xff1a;B站【GeekHour】30分钟Docker入门教程: link 2. Docker简介 Docker是一个用于构建运行 传送 应用程序的平台。 与虚拟机的区别 虚拟机使用了一种叫做虚拟化的技术。每台虚拟机需要占…

固定测斜仪:工程观测的精密利器

在工程观测测量领域&#xff0c;固定测斜仪扮演着至关重要的角色。固定测斜仪&#xff0c;凭借其耐冲击型倾斜传感器、出色的可靠性、快速稳定的特点&#xff0c;以及简洁的安装和智能识别功能&#xff0c;已成为行业内重要工具。其输出信号为RS485数字量&#xff0c;可直接显示…

使用electron打包vuecli创建的项目

下面是我打包的时候才过的所有的坑&#x1f4a3;&#xff1a; 首先创建一个vue2的空项目&#xff0c;如果全局安装的vue-cli版本太低&#xff0c;低于3就无法使用vue create命令&#xff0c;必须使用uninstall将之前的卸载掉&#xff0c;在重现安装&#xff0c;之后的就是最近…

握手问题(蓝桥杯)

文章目录 握手问题【问题描述】答案&#xff1a;1204解题思路模拟 握手问题 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c;大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#…