Qt窗口——对话框

文章目录

    • 对话框
    • 自定义对话框
    • 对话框分类
    • 消息对话框QMessageBox
      • 使用示例
      • 自定义按钮
      • 快速构造对话框
    • 颜色对话框QColorDialog
    • 文件对话框QFileDialog
    • 字体对话框QFontDialog
    • 输入对话框QInputDialog

对话框

对话框可以理解成一个弹窗,用于短期任务或者简洁的用户交互

Qt内置对话框:

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

继承QDialog:
在这里插入图片描述
在这里插入图片描述

实际开发都是创建额外的类,让额外的类继承QDialog

继承QMainWindow:

往ui文件里面添加一个按钮,设置槽,点击按钮就会弹出对话框:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDialog>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("弹窗");dialog->resize(300,400);dialog->show();
}

GIF 2024-9-21 12-33-50

内存泄漏问题:

点击一次按钮,就弹出一个对话框,即每次点击都会创建新的QDialog对象。

如果无数次点击这个按钮,就会产生无数次这个对象,进而引发内存泄漏。

如果将delete操作直接放入:

void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("弹窗");dialog->resize(300,400);dialog->show();delete dialog;
}

这样弹窗一闪而过,正确的做法是将delete和关闭按钮的信号关联起来。

Qt给QDialog设置了属性,通过设置属性,完成上述效果

void MainWindow::on_pushButton_clicked()
{QDialog* dialog = new QDialog(this);dialog->setWindowTitle("弹窗");dialog->resize(300,400);dialog->show();dialog->setAttribute(Qt::WA_DeleteOnClose);
}

自定义对话框

要想自定义对话框,就要继承QDialog创建类

纯代码:

创建一个C++类,继承自QDialog

image-20240921125947229

dialog.h

#ifndef DIALOG_H
#define DIALOG_H#include <QWidget>
#include<QDialog>
class Dialog : public QDialog
{Q_OBJECT
public:Dialog(QWidget* parent);void handle();
};#endif // DIALOG_H

dialog.cpp

#include "dialog.h"
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>
Dialog::Dialog(QWidget* parent) : QDialog(parent)
{//创建控件加入dialog当中QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("对话框");QPushButton* button = new QPushButton("关闭");layout->addWidget(label);layout->addWidget(button);connect(button, &QPushButton::clicked, this, &Dialog::handle);
}void Dialog::handle()
{this->close();
}
#include "dialog.h"
#include<QPushButton>
#include<QLabel>
#include<QVBoxLayout>
Dialog::Dialog(QWidget* parent) : QDialog(parent)
{//创建控件加入dialog当中QVBoxLayout* layout = new QVBoxLayout();this->setLayout(layout);QLabel* label = new QLabel("对话框");QPushButton* button = new QPushButton("关闭");layout->addWidget(label);layout->addWidget(button);connect(button, &QPushButton::clicked, this, &Dialog::handle);
}void Dialog::handle()
{this->close();
}

mianwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<dialog.h>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Dialog* dialog = new Dialog(this);dialog->resize(400, 300);dialog->setAttribute(Qt::WA_DeleteOnClose);dialog->show();
}

GIF 2024-9-21 13-26-36

图形化:

创建新的ui文件:

image-20240921132926374

image-20240921135018533

对话框分类

  • 模态对话框: 表示弹出对话框的时候,此时用户无法操作父窗口,必须完成对话框内部的操作,关闭之后,才可进行操作父窗口
    一般用于关键的场合,用户必须做出决策
  • 非模态: 弹出对话框之后,用户可以操作父窗口
    上面写的对话框,都是非模态

QDialog::exec()表示模态

QDialog::show()表示非模态

消息对话框QMessageBox

弹出一个对话框,给用户显示消息,并让用户进行一个简单的选择

使用示例

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{//创建QMessageBox* messageBox = new QMessageBox();messageBox->setWindowTitle("对话框标题");messageBox->setText("对话框文本");messageBox->setIcon(QMessageBox::Warning);messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);messageBox->exec();//模态对话框一直处于阻塞状态,知道对话框关闭,使用可以直接在后面deletedelete messageBox;
}

QMessageBox内置的图标:

image-20240921140634754

QMessageBox内置按钮:

image-20240921140702394

用户点击按钮的时候,可以通过exec的返回值(按钮枚举的值)来知道用户点击的是哪个按钮,从而执行了哪些操作

image-20240921140903918

自定义按钮

void MainWindow::on_pushButton_clicked()
{//创建QMessageBox* messageBox = new QMessageBox();messageBox->setWindowTitle("对话框标题");messageBox->setText("对话框文本");messageBox->setIcon(QMessageBox::Warning);//messageBox->setStandardButtons(QMessageBox::Ok | QMessageBox::Save | QMessageBox::Cancel);QPushButton* button = new QPushButton("按钮", messageBox);messageBox->addButton(button, QMessageBox::AcceptRole);messageBox->exec();delete messageBox;
}

image-20240921142835383

快速构造对话框

QMessageBox提供了静态函数,可以快速构造对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QMessageBox>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{int ret = QMessageBox::warning(this, "标题", "文本", QMessageBox::Ok | QMessageBox::Cancel);if(ret == QMessageBox::Ok){qDebug() << "Ok";   }else if(ret == QMessageBox::Cancel){qDebug() << "Cancel";}
}

颜色对话框QColorDialog

QColorDialog颜色对话框的功能是允许用户选择颜色,相当于调色板,继承自QDialog

常用方法:

  • QColorDialog(QWidget* parent = nullptr)创建对象的同时设置父对象

  • QColorDialog(const QColor &initial, QWidget* parent = nullptr)创建对象的同时通过QColor对象设置默认颜色和父对象

  • void setCurrentColor(const QColor &color)设置当前颜色对话框

  • QColor getColor(const QColor &initial = Qt::white, QWidget *parent = nullptr, const QString &title = QString(), QColorDialog::ColorDialogOptions options = ColorDialogOptions())打开颜色对话框,返回一个QColor对象

    是一个静态函数,不必创建对话框对象就可以直接使用

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

  • void open(QObject *receiver, const char* member)打开颜色对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QColorDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");qDebug() << color;
}

image-20240921150052826

这里的a表示alpha不透明度

后面的就表示RGB的值,范围是[0, 1]

1对应整数255;0对应整数0

修改窗口颜色:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QColorDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QColor color = QColorDialog::getColor(QColor(0, 255, 0), this, "选择颜色");qDebug() << color;//QSS方式设置
//    QString style = "background-color: rgb(" +
//            QString::number(color.red()) + ", "
//            + QString::number(color.green()) + ", "
//            + QString::number(color.blue()) + ");";char style[1024] = { 0 };sprintf(style, "background-color: rgb(%d, %d, %d)", color.red(), color.green(), color.blue());this->setStyleSheet(style);
}

GIF 2024-9-21 15-07-00

文件对话框QFileDialog

文件对话框用于应用程序需要打开一个外部文件或者将当前文件存储到指定的外部文件

常用方法:

  • 打开文件(一次打开一个文件)

    static QString getOpenFileName(QWidget *parent = nullptr,const QString &caption = QString(),const QString &dir = QString(),const QString &filter = QString(),QString *selectedFilter = nullptr,Options options = Options());
    
  • 打开多个文件(一次打开多个)

    static QStringList getOpenFileNames(QWidget *parent = nullptr,const QString &caption = QString(),const QString &dir = QString(),const QString &filter = QString(),QString *selectedFilter = nullptr,Options options = Options());
    
  • 保存文件

    static QString getSaveFileName(QWidget *parent = nullptr,const QString &caption = QString(),const QString &dir = QString(),const QString &filter = QString(),QString *selectedFilter = nullptr,Options options = Options());
    

    参数说明:

    1. parent父亲
    2. caption对话框标题
    3. dir默认打开路径
    4. filter文件过滤器
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFileDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{QString filePath = QFileDialog::getOpenFileName(this);qDebug() << filePath;
}void MainWindow::on_pushButton_2_clicked()
{QString filePath = QFileDialog::getSaveFileName(this);qDebug() << filePath;
}

此处的打开/保存的功能都是需要额外实现的,并不是说按下就打开/保存了

GIF 2024-9-21 15-17-51

字体对话框QFontDialog

QFontDialog用于让用户选择字体的属性

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QFontDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{bool ok = false;QFont font = QFontDialog::getFont(&ok);qDebug() << "ok = " << ok;qDebug() << font;//选择的字体相关属性设置到按钮上ui->pushButton->setFont(font);
}

GIF 2024-9-21 15-28-32

输入对话框QInputDialog

QInputDialog允许用户输入一个具体的数据(整数、浮点数、字符串)

常用方法:

  • 双精度浮动型输入数据对话框

    static double getDouble(QWidget *parent, const QString &title, const QString &label, double value,double minValue, double maxValue, int decimals, bool *ok, Qt::WindowFlags flags,double step);
    
  • 整数输入数据对话框

    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 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);
    

    参数说明:

    1. parent父亲
    2. title对话框标题
    3. label对话框标签
    4. items可选择条目
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QInputDialog>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{int ret = QInputDialog::getInt(this, "整数输入对话框", "输入整数: ");qDebug() << ret;
}void MainWindow::on_pushButton_2_clicked()
{QStringList items;items.push_back("123");items.push_back("456");items.push_back("789");QString item = QInputDialog::getItem(this, "条目输入对话框", "输入条目:", items);qDebug() << item;
}

GIF 2024-9-21 15-40-17

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

2024华为杯研赛D题分析

2024华为杯研究生数学建模D题分析如下&#xff0c;完整版本在文末名片

【HTTP】请求“报头”,Referer 和 Cookie

Referer 描述了当前这个页面是从哪里来的&#xff08;从哪个页面跳转过来的&#xff09; 浏览器中&#xff0c;直接输入 URL/点击收藏夹打开的网页&#xff0c;此时是没有 referer。当你在 sogou 页面进行搜索时&#xff0c;新进入的网页就会有 referer 有一个非常典型的用…

扎克伯格的未来愿景:用智能眼镜引领数字社交新时代

Meta Connect 2024大会前夕&#xff0c;创始人马克扎克伯格的90分钟播客访谈&#xff0c;为我们描绘了Meta未来的蓝图。这场访谈&#xff0c;不仅是大会的热身&#xff0c;更是对科技未来的一次深刻洞察。 人工智能 - Ai工具集 - 未来办公人的智能办公生活导航网 扎克伯格的未…

nacos适配人大金仓的数据库

前言 在微服务架构中&#xff0c;服务发现和配置管理是关键组件。Nacos作为一个动态服务发现和配置管理平台&#xff0c;支持多种数据库作为其后端存储。本文将探讨如何在Nacos中适配人大金仓数据库&#xff0c;以及在此过程中的最佳实践。 Nacos简介 Nacos&#xff08;Nami…

二分查找算法(1) _二分查找_模板

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(1) _二分查找模板 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 1. 二…

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上&#xff0c;所以Redis性能高。 但是当重启的时候&#xff0c;或者因为特殊情况导致Redis崩了&#xff0c;就可能导致数据的丢失。 所以Redis采取了持久化的机制&#xff0c;重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…

[Matplotlib教程] 02 折线图、柱状图、散点图教程

基于MFCC和CNN的语音情感识别 2 折线图、柱状图、散点图2.1 折线图2.1.1 简单折线图2.1.1 线形和Markevery2.1.2 带误差棒的折线图2.1.3 区间填充和透明度 2.2 柱状图2.2.1 分组柱状图2.2.2 堆叠柱状图2.2.3 横向柱状图 2.3 散点图 我们的网站是 菜码编程&#xff0c;我们的q群…

django项目添加测试数据的三种方式

文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式&#xff1a; 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…

2024华为杯数学建模研赛F题建模代码思路文章研究生数学建模

截止2024.8.21 12点 已更新F全部小问的建模和问题一的代码 #### https://docs.qq.com/doc/DVVBUREF2SmFhRUl3F题: 问题1&#xff1a;卫星轨道根数与运动学关系的数学模型 从卫星的轨道根数计算出它在特定时刻的三维位置和速度。轨道根数包括&#xff1a; 1.计算卫星的轨道半径…

Android Studio开发发布教程

本文讲解Android Studio如何发布APP。 在Android Studiobuild菜单栏下点击Generate Singed Bundle/APK…打开对话框。 选择APK点击Next 点击Create New...进行创建

【赵渝强老师】K8s的DaemonSets控制器

DaemonSet控制器相当于在节点上启动了一个守护进程。通过使用DaemonSet可以确保一个Pod的副本运行在 Node节点上。如果有新的Node节点加入集群&#xff0c;DaemonSet也会自动给新加入的节点增加一个Pod的副本&#xff1b;反之&#xff0c;当有Node节点从集群中移除时&#xff0…

KMP整理+个人推导+快速上手理解

整理了一下KMP的写法&#xff1a; 这个是我自己写的&#xff08;个人推导&#xff0c;可能在时间复杂度上表现较弱&#xff0c;但是非常帮助初学者进行理解&#xff01;&#xff09; 下面是代码&#xff0c; ne 是next数组。我这个next数组表示的是&#xff1a; ne[i] : 当s…

Spring Boot框架在高校心理辅导中的实践

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

独立站内容营销SOP 1.0 丨出海笔记

提到内容营销&#xff0c;可能很多朋友都听过但没深入做&#xff0c;国内跨境独立站通过内容营销做的大流量的目前不多&#xff0c;哪怕大如 Shein, Anker&#xff0c;大部分时候还是在买量获客的阶段。 但大家只要明白一点即可&#xff1a;内容做得好不好&#xff0c;直接影响…

AD中的PCB的原点怎么设置?

在AD中&#xff0c;可以通过编辑元件的属性或者直接在PCB编辑器中设置原点来设置PCB或元件的原点。 对于PCB设计&#xff0c;你可以在PCB编辑器中直接设置原点。首先&#xff0c;你需要打开你的PCB设计文件。然后&#xff0c;在PCB编辑器中&#xff0c;选择“编辑”菜单下的“原…

在JSP环境配置中遇到的一些问题

本人使用eclipse进行开发&#xff0c;在eclipse中配置环境。 1.安装Tomcat 下载版本为tomcat-9.0.95&#xff1b; 详见教程&#xff1a;tomcat下载安装及配置教程_tomcat安装-CSDN博客 遇到的问题&#xff1a;运行startup.bat会闪退&#xff0c; 解决办法&#xff1a;tomcat…

UI自动化测试(python)Web端4.0

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

众数信科 | CrowdAgents 企业级AI智能体平台

AI大模型在企业落地 还存在很多问题 企业需要什么样的大模型产品 众数信科 CrowdAgents企业级AI智能体平台 平台亮点 01 02 03 核心功能 AI智能体 AI企业智脑 Agent引擎 关于我们 众数信科成立于2021年&#xff0c;由云从科技联合厦门火炬集团、民生电商作为创始股东发起成…

智能仓库|基于springBoot的智能无人仓库管理设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xf…

【24华为杯数模研赛赛题思路已出】国赛B题思路丨附参考代码丨免费分享

2024年华为杯研赛B题解题思路 B题 WLAN组网中网络吞吐量建模 问题1 请根据附件WLAN网络实测训练集中所提供的网络拓扑、业务流量、门限、节点间RSSI的测试基本信息&#xff0c;分析其中各参数对AP发送机会的影响&#xff0c;并给出影响性强弱的顺序。通过训练的模型&#xff…