【qt】自定义对话框
自定义对话框
- 一.自定义对话框的使用
- 1.应用场景
- 2.项目效果
- 3.界面拖放
- 4.模型和视图的设置
- 5.action功能实现
- 二.自定义对话框的创建
- 1.设置对话框界面
- 2.创建对话框
- 三.对话框的功能与样式实现
- 1.对话框数据的交换
- 2.对话框的显示
- 3.设置对话框的特性
- 4.完成按钮的功能
- 四.编辑表头的对话框
- 1.对话框界面设计
- 2.创建对话框
- 3.为对话框添加模型
- 4.对话框功能实现
- 四.单元格的对话框
- 五.总结
一.自定义对话框的使用
1.应用场景
像我们前面一般就是只有一个主窗口,或者是只有一些简单的对话框,有的时候我们需要多窗口操作,并且需要一下高级的对话框的时候,我们就可以自定义来达到我们的需求。
2.项目效果
纸上得来终觉浅,咱们还是来继续跟着项目来



咱们有3个功能,我们就自定义3个对话框,并能完成相应的功能,OK,咋们开始吧!
3.界面拖放

这个我就不讲了,需要蔬菜的可以dd我
这里是把tableView设置为了中心组件
4.模型和视图的设置
还记得我们原来在tableView里面讲的的模型和视图嘛,现在我们来添加模型和设置视图。

哈哈,给你们截图,不给你们代码,自己敲,涨涨记性。

创建模型,并为视图设置模型!
运行结果:

但是很丑咯,只显示了一部分,还需要我手动放大,才能显示全,我们可以对表头的视图进行设置。

运行结果:

现在,表头就可以自动的拉伸,非常的银信,哈哈.
5.action功能实现
对咱们的action使用转到槽,接下来就是重点了.好好看,好好学!
二.自定义对话框的创建
1.设置对话框界面

选择不带按钮的对话框

类名,你自己随便起:

OK,现在就开始来设计我们的对话框,
这里可以设置按钮的图标哦.

设计完我们的对话框设计

2.创建对话框
首先在mainwindow.cpp包含咱们的头文件

void MainWindow::on_actionResize_triggered()
{DialogResize*dialogResize=new DialogResize(this);
}
这样我们自定义的对话框就创建好了!
三.对话框的功能与样式实现
1.对话框数据的交换
首先我们需要对话框拿到我们主窗口默认的行列数.
所以我们需要在dialogresize.h设置公有接口.

具体的实现:

现在就可以进行使用了
void MainWindow::on_actionResize_triggered()
{DialogResize*dialogResize=new DialogResize(this);dialogResize->setCol(model->columnCount());dialogResize->setRow(model->rowCount());}

但是现在我们点击这个按钮无效,因为对话框还没有进行显示!
2.对话框的显示
dialogResize->exec();//模态方式进行显示,就是必须要处理完对话框,才能对主窗口进行操作
运行结果:

3.设置对话框的特性

4.完成按钮的功能
现在我们点对话框的确定和取消都是没有用的.
对按钮转到槽
void DialogResize::on_pushButtonOK_clicked()
{//关闭对话框 并返回一个QDialog::Accepted的枚举值accept();
}void DialogResize::on_pushButtonCancel_clicked()
{//关闭对话框 并返回一个QDialog::Reject的枚举值reject();
}
那咱们这个返回值由谁来接收呢?答案就是对话框显示的接口
int ret=dialogResize->exec();//模态方式进行显示,就是必须要处理完对话框,才能对主窗口进行操作if(ret==QDialog::Accepted){//如果点击了确定,咱们就对主窗口的行列进行设置}
很明显,咱们现在需要去拿到对话框里面的数据,用面向对象的思想,去对话框里面设置接口.

具体实现:
int DialogResize::getRowCount()
{return ui->spinBoxRow->value();
}int DialogResize::getColCount()
{return ui->spinBoxCol->value();
}
现在就可以拿到数据,并对模型进行设置了
void MainWindow::on_actionResize_triggered()
{DialogResize*dialogResize=new DialogResize(this);dialogResize->setCol(model->columnCount());dialogResize->setRow(model->rowCount());//对话框固定,不能对对话框进行拉伸dialogResize->setWindowFlags(dialogResize->windowFlags()|Qt::MSWindowsFixedSizeDialogHint);int ret=dialogResize->exec();//模态方式进行显示,就是必须要处理完对话框,才能对主窗口进行操作if(ret==QDialog::Accepted){//如果点击了确定,咱们就对主窗口的行列进行设置int rows=dialogResize->getRowCount();int cols=dialogResize->getColCount();model->setRowCount(rows);model->setColumnCount(cols);}//因为每次打开都new了一个窗口,需要我们手动删除delete dialogResize;//每次我们要手动关闭
}
运行结果:

OK,就变成了10*10了

这样一个功能就基本把对话框的套路讲清楚了,接下来还有两个对话框,多注意一下细节就OK了.
四.编辑表头的对话框
1.对话框界面设计

2.创建对话框
这次我们在mainwindow.h中添加我们的对话框

添加私有成员

然后开始创建;
void MainWindow::on_actionHeader_triggered()
{//只创建一次,对话框可以重复使用if(dialogHeader==NULL){dialogHeader=new DialogHeader(this);//设置父窗口this,有个好处就是当我们关闭主窗口的时候,会调用对话框的析构函数}
}
3.为对话框添加模型

创建模型和视图设置模型:

4.对话框功能实现
我们需要获取表头的值来初始化对话框的视图模型
在dialogHeader.h中
实现:
void DialogHeader::setList(const QStringList &list)
{model->setStringList(list);
}
对按钮还是用转到槽:
void DialogHeader::on_pushButtonOK_clicked()
{accept();
}void DialogHeader::on_pushButtonCancel_clicked()
{reject();
}
我们还需要对话框的模型视图来设置主窗口的表头信息.

实现:

void MainWindow::on_actionHeader_triggered()
{//只创建一次,对话框可以重复使用if(dialogHeader==NULL){dialogHeader=new DialogHeader(this);//设置父窗口this,有个好处就是当我们关闭主窗口的时候,会调用对话框的析构函数}//将表头的数据设置到ListView视图中QStringList list;for(int i=0;i<model->columnCount();i++){list.append(model->headerData(i,Qt::Horizontal).toString());}dialogHeader->setList(list);int ret=dialogHeader->exec();if(ret==QDialog::Accepted){//设置水平表头的信息model->setHorizontalHeaderLabels(dialogHeader->getList());}
}
运行结果:

四.单元格的对话框
基本都差不多,我只重点的讲一下不同的地方!刚刚我们都玩的模态的,现在我们来玩玩非模态的,就是主窗口和父窗口可以同时进行操作.
UI设计:

在mainwindow.h中
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include "dialogheader.h"
#include "dialoglocation.h"//定位单元格头文件QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void setEnable(bool flag);void setCell(int row,int col,QString text);//设置主窗口的单元格信息private slots:void on_actionResize_triggered();void on_actionHeader_triggered();void on_actionLocation_triggered();private:Ui::MainWindow *ui;QStandardItemModel*model;QItemSelectionModel*selectionModel;DialogHeader*dialogHeader=NULL;DialogLocation*dialogLocation=NULL;//定位单元格
};
#endif // MAINWINDOW_H
在mainwindow.cpp中
void MainWindow::on_actionLocation_triggered()
{dialogLocation=new DialogLocation(this);//当关闭对话框时, 会自动的回收内存,就不用delete去删除了dialogLocation->setAttribute(Qt::WA_DeleteOnClose);//对话框一直在表面 参数为原有的属性加新的属性dialogLocation->setWindowFlags(dialogLocation->windowFlags()|Qt::WindowStaysOnTopHint);dialogLocation->setMaxRowCol(model->rowCount()-1,model->columnCount()-1);auto index=selectionModel->currentIndex();dialogLocation->setCurrenRowCol(index.row(),index.column());dialogLocation->show();//模态方式进行显示,点击按钮是不会关闭的,同时主窗口也可以继续操作
}
在dialoglocation.h中
#ifndef DIALOGLOCATION_H
#define DIALOGLOCATION_H#include <QDialog>namespace Ui {
class DialogLocation;
}class DialogLocation : public QDialog
{Q_OBJECTpublic:explicit DialogLocation(QWidget *parent = nullptr);~DialogLocation();void setMaxRowCol(int rowMax,int colMax);void setCurrenRowCol(int row,int col);
private:
//对话框关闭和打开时自动调用void closeEvent(QCloseEvent *event);void showEvent(QShowEvent*event);private slots:void on_pushButtonOk_clicked();void on_pushButtonCancel_clicked();private:Ui::DialogLocation *ui;
};#endif // DIALOGLOCATION_H
在dialogLocation.cpp中
#include "dialoglocation.h"
#include "ui_dialoglocation.h"
#include "mainwindow.h"DialogLocation::DialogLocation(QWidget *parent) :QDialog(parent),ui(new Ui::DialogLocation)
{ui->setupUi(this);
}DialogLocation::~DialogLocation()
{delete ui;
}void DialogLocation::setMaxRowCol(int rowMax, int colMax)
{ui->spinBoxRow->setMaximum(rowMax);ui->spinBoxCol->setMaximum(colMax);
}void DialogLocation::setCurrenRowCol(int row, int col)
{ui->spinBoxCol->setValue(col);ui->spinBoxRow->setValue(row);
}void DialogLocation::on_pushButtonOk_clicked()
{MainWindow*mainWindow=(MainWindow*)parentWidget();mainWindow->setCell(ui->spinBoxRow->value(),ui->spinBoxCol->value(),ui->lineEdit->text());if(ui->checkBoxCol->isChecked()){ui->spinBoxCol->setValue(ui->spinBoxCol->value()+1);}if(ui->checkBoxRow->isChecked()){ui->spinBoxRow->setValue(ui->spinBoxRow->value()+1);}
}void DialogLocation::on_pushButtonCancel_clicked()
{close();
}
void DialogLocation::closeEvent(QCloseEvent *event)
{MainWindow*mainWindow=(MainWindow*)parentWidget();mainWindow->setEnable(true);
}
void DialogLocation::showEvent(QShowEvent*event)
{MainWindow*mainWindow=(MainWindow*)parentWidget();mainWindow->setEnable(false);
}
运行结果:

确实类比较多,跳来跳去,不好截图,所以我就都截下来了,有不懂的可以问我.
五.总结
对于自定义的对话框,也是有模板套路可寻的,注意的是数据之间的交互,面向对象的思想!
确实我感觉我截的有点乱,来给你们一个我梳理的思维导图吧!

是不是很爱你呀!哈哈.
两岸猿声啼不住,轻舟已过万重山
相关文章:
【qt】自定义对话框
自定义对话框 一.自定义对话框的使用1.应用场景2.项目效果3.界面拖放4.模型和视图的设置5.action功能实现 二.自定义对话框的创建1.设置对话框界面2.创建对话框 三.对话框的功能与样式实现1.对话框数据的交换2.对话框的显示3.设置对话框的特性4.完成按钮的功能 四.编辑表头的对…...
汽车IVI中控开发入门及进阶(二十二):video decoder视频解码芯片
前言: 视频解码器在许多汽车、专业和消费视频应用中仍有需求。Analog Devices是模拟视频产品领域的行业领导者,提供一系列视频解码器,可将标准(SD,standard definition)和高清(HD,High definition)分辨率的模拟视频高质量转换为MIPI或TTL格式的数字视频数据。典型的应…...
混沌测试介绍
混沌测试介绍 1. 混沌测试简介 混沌测试(Chaos Engineering)是一种测试方法,通过在生产环境中故意引入故障,测试系统在异常情况下的表现,以提高系统的弹性和鲁棒性。其目标是确保系统能够在面对不可预见的事件或故障…...
python 单链表创建,遍历
# !/usr/bin/python3 # -*- coding:utf-8 -*- """ author: JHC000abcgmail.com file: 111.py time: 2024/05/30 21:37:09 desc:""" # 定义单链表结构 class ListNode:def __init__(self,value0,nextNone):self.value valueself.next nextdef _…...
【方法】如何取消PPT“以只读方式打开“?
以“只读方式”打开的PPT,可能会受到不同的限制,比如无法编辑修改内容,无法保存原文件等。那如何取消PPT的“只读方式”呢?不同形式的“只读方式”,取消方法不同,下面一起来看看吧! “只读方式”…...
ChatTTS,语气韵律媲美真人的开源TTS模型,文字转语音界的新魁首,对标微软Azure-tts
前两天 2noise 团队开源了ChatTTS项目,并且释出了相关的音色模型权重,效果确实非常惊艳,让人一听难忘,即使摆在微软的商业级项目Azure-tts面前,也是毫不逊色的。 ChatTTS是专门为对话场景设计的文本转语音模型&#x…...
Django企业招聘后台管理系统开发实战四
前言 首先我们看一下产品的需求背景,这个产品为了解决招聘面试的过程中,线下面试管理效率低,面试过程和结果不方便跟踪的痛点 招聘管理的系统几乎是每一家中小公司都需要的产品 我们以校园招聘的面试为例子来做 MVP 产品迭代 首先我们来看一下…...
APP上架 篇一:上架资质要求
文章目录 系列文章Apple Store商店上架App官方文档资质要求费用详情Google Play商店上架App官方文档资质要求费用详情华为应用商店上架App官方文档资质要求费用详情小米应用商店上架App官方文档资质要求...
C++入门之类和对象
目录 1.C相对于C语言的一些不同的小语法 1.1命名空间 1.2C输入&输出 1.3缺省参数 1.4函数重载 1.5引用 1.6内联函数 1.7auto 1.8nullptr 2.类的引入 2.1类的内部 2.2this指针 2.3类的默认成员函数 2.3.1构造函数 2.3.2析构函数 2.3.3拷贝构造 2.4运…...
html中table的替代方案
使用插件,2个功能强大的table插件 DataTables | Javascript table library 专门的table处理插件,下载时可以配置是否支持bootstrap和jquery ui等。参数众多。表格组件 table - Layui 文档 国内的插件,只支持jquery,配合默认的layu…...
单片机的自动化编程语言:深度探索与未来展望
单片机的自动化编程语言:深度探索与未来展望 单片机作为现代电子设备的核心控制单元,其自动化编程语言的发展与应用,对提升设备性能、简化编程流程具有重大意义。本文将从四个方面、五个方面、六个方面和七个方面,对单片机的自动…...
k8s 部署 Dashboard
Dashboard 是官方提供的一个UI,可用于基本管理K8s资源。 # 在master节点执行# wget \ https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml vi recommended.yaml 增加 nodePort: 30001 和 type: NodePort ...... spec:p…...
HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;
目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议(Hypertext Transfer Protocol)是…...
【机器学习】随机森林:深度解析与应用实践
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 随机森林:深度解析与应用实践引言1. 随机森林基础1.1 什么是随机森林…...
pytorch使用tensorboardX面板自动生成模型结构图和各类可视化图像
总结: 在原本代码中额外添加如下几行即可实现查看模型结构: from tensorboardX import SummaryWriter # 用于进行可视化# 1. 来用tensorflow进行可视化with SummaryWriter("./log", comment"sample_model_visualization") as sw: …...
C# 键值对
一、键值对的基本使用 1、增 Dictionary<int, decimal> dic new Dictionary<int, decimal>();//创建键值对,键的类型为int 值的类型为decimaldic.Add(1, 2.5m);dic.Add(2, 3.7m);dic.Add(3, 4.2m);//添加三组数据 2、删 ① 根据键值对中的键值删除某…...
android 应用安装目录
三方:data/app/ 系统应用:system/app/ 声明so压缩 android:extractNativeLibstrue如果lib没有so,可能是在base.apk,如果so不压缩,直接在base.apk运行时提取 https://www.cnblogs.com/xiaxveliang/p/14583802.html 若…...
Centos 7 安装刻录至硬件服务器
前言 在日常测试中,会遇到很多安装的场景,今天给大家讲一下centos 7 的安装,希望对大家有所帮助。 一.下载镜像 地址如下: centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…...
动手学深度学习4.6 暂退法-笔记练习(PyTorch)
以下内容为结合李沐老师的课程和教材补充的学习笔记,以及对课后练习的一些思考,自留回顾,也供同学之人交流参考。 本节课程地址:丢弃法_哔哩哔哩_bilibili 本节教材地址:4.6. 暂退法(Dropout)…...
C++ 头文件优化
C 是一种灵活的语言,所以需要一种积极的方法来分析和减少编译时依赖。一种常见的达到这个目的的方法是,将依赖从头文件里转移到源代码文件里。实现这个目的的方法叫做提前声明。 简而言之,这些声明告诉编译器某个函数接受和返回哪些参数&…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
