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

运行结果:
在这里插入图片描述
确实类比较多,跳来跳去,不好截图,所以我就都截下来了,有不懂的可以问我.

五.总结

对于自定义的对话框,也是有模板套路可寻的,注意的是数据之间的交互,面向对象的思想!
确实我感觉我截的有点乱,来给你们一个我梳理的思维导图吧!
在这里插入图片描述

是不是很爱你呀!哈哈.

两岸猿声啼不住,轻舟已过万重山

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

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

相关文章

数组中的第K个最大元素,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 快速理解解题思路小建议&#xff1a; 审题目事例提示&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 题目地址&#xff1a; 215. 数组中的第K个最大元素 - 力扣&#xff08;LeetCode&a…

ChatGPT的逆袭历程:核心技术深度解析

在ChatGPT问世之前&#xff0c;已有许多大模型存在&#xff0c;但为何只有它成为了AI时代的“iPhone时刻”&#xff1f;这不仅得益于其技术优势&#xff0c;还在于其发展过程中所采用的一系列创新策略。本文将深度复盘ChatGPT的逆袭历程&#xff0c;分析其核心技术&#xff0c;…

MySQL数据库--从创建数据库到删库跑路

目录 MySQL安装: 1. 数据库基本操作1.1 创建数据库1.2 显示当前数据库1.3 删除数据库1.4 使用数据库/选中数据库 2. SQL中的数据类型2.1 数值类型2.2 字符串类型2.3 时间类型 3. 表的操作3.2 创建表3.1 显示数据库中的表3.3 查看表的详细情况3.4 删除表3.5 注释3. 修改列(了解即…

数据结构 | 二叉树(基本概念、性质、遍历、C代码实现)

1.树的基本概念 树是一种 非线性 的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根…

五分钟“手撕”链表

为了提高大家的学习效率&#xff0c;我把代码放开头&#xff0c;供查阅。 目录 一、链表的实现代码 二、什么是链表 三、链表的分类 四、链表的常见操作 插入 删除 五、Java自带的LinkedList 两个构造方法 一些常用方法 六、LinkedList的遍历 七、ArrayList和Linke…

华媒舍:10种欧洲地区媒体发稿推广技巧

1.了解欧洲地区媒体自然环境必须掌握欧洲地区媒体的发稿推广方法&#xff0c;首先要对欧洲地区媒体自然环境有一定的了解。包含不一样国家的主力媒体&#xff0c;他的阅读者人群、销售市场遮盖及其报导风格等。仅有熟悉媒体自然环境&#xff0c;才能更好的制订营销推广策略。 …

Web----网络通讯部分

一、TCP和UDP的区别 TCP是一种面向连接的协议&#xff0c;它在传输数据之前会建立一条专用的通信连接。这意味着在数据传输过程中&#xff0c;两台计算机之间会有一条稳定的数据传输通道。因此&#xff0c;TCP可以保证数据传输的可靠性&#xff0c;但会带来一定的延迟。 UDP是…

Android VSYNC双Buffer与三Buffer渲染线程RenderThread(5)

Android VSYNC双Buffer与三Buffer渲染线程RenderThread&#xff08;5&#xff09; 手机自带的卡顿丢帧分析工具&#xff0c;柱状图&#xff1a; 帧的大体绘制过程&#xff1a; 帧绘制中的重要概念&#xff1a;BufferQueue 首先看一下 BufferQueue&#xff0c;BufferQueue 是一个…

Visual Studio Code 开发esp8266流程2Arduino 配置 nodemcu

http://arduino.esp8266.com/stable/package_esp8266com_index.json Arduino: Library Manager

第二十五章CSS中的技巧(导航栏、下拉列表)

1.CSS精灵 1.什么是CSS精灵 英文叫法 CSS sprites&#xff0c;通常被解释为“CSS图像拼合”或“CSS贴图定位”;其实就是把网页中一些背景图片整合到一张图片文件中&#xff0c;再利用css“background-image”&#xff0c; “background-repeat”,“background-position”的组…

中国地质大学(武汉):23考研多专业接受调剂,24新增上机考试!中国地质大学(武汉)计算机考研考情分析!

中国地质大学&#xff08;武汉&#xff09;计算机学院成立于1985年&#xff0c;其前身为地矿部武汉计算站。经过近二十年的努力&#xff0c;计算机学院不断发展壮大。现设有计算机应用、计算机软件、网络与系统结构、信息安全四个教研室&#xff1b;拥有湖北省计算机应用技术重…

最大回撤概念与计算

一、最大回撤&#xff0c;是指的最大下跌的值&#xff1a; 1、即所有下跌趋势中&#xff0c;净值最低的点&#xff0c;与历史净值最高点直接的差值。 2、最大回撤取绝对值显示 二、如果有时间限制&#xff0c;则计算对应时间段内的最大回撤。 示意图如下&#xff1a; 三、举…

【Java面试】七、SpringMvc的执行流程、SpringBoot自动装配原理

文章目录 1、SpringMVC的执行流程1.1 视图阶段1.2 前后端分离阶段 2、SpringBoot自动配置原理3、框架常用的注解3.1 Spring的注解3.2 SpringMvc的注解3.3 SpringBoot的注解 4、面试 1、SpringMVC的执行流程 1.1 视图阶段 旧项目中&#xff0c;未前后端分离时&#xff0c;用到…

OAK相机如何将 YOLOv10 模型转换成 blob 格式?

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ashely。 专…

Microsoft Fabric 是什么?

最近半个月没有更新内容&#xff0c;原因是什么呢&#xff1f; 原因是花了两周的时间备考了一下"Microsoft Certified: Fabric Analytics Engineer Associate"的考试认证。 非常幸运考试通过了。 那什么是Microsoft Fabric 呢&#xff1f; Microsoft Fabric 是一个…

运筹学_4.整数规划

文章目录 引言4.1 分枝定界方法求解整数规划问题整数规划的分类整数规划解法概述分支定界法 4.2 0-1整数规划0-1整数规划的数学模型隐枚举法求解0-1规划问题 4.3 指派问题(分配问题)的匈牙利解法指派问题的数学模型指派问题的匈牙利解法 引言 规划中的决策变量(全部或部分)限制…

【备战蓝桥杯】蓝桥杯省一笔记:算法模板笔记(Java)

蓝桥杯 0、快读快写模板1、回文判定2、前缀和3、差分4、二分查找5、快速幂6、判断素数7、gcd&lcm8、进制转换9、位运算10、字符串常用API11、n的所有质因子12、n的质因子个数13、n的约数个数14、n阶乘的约数个数15、n的约数和16、阶乘 & 双阶乘17、自定义升序降序18、动…

2024盘古石初赛(服务器部分)

赛后总结 这次初赛就有20道服务器部分赛题&#xff0c;做的情况一般&#xff0c;错了5道题这样&#xff0c;主要原因就是出在第二个网站服务器没有重构起来 今天来复现一下 这次的服务器部分我直接用仿真仿起来就开找了 第一台IM前期配置 先把网配置好&#xff0c;然后ssh…

如此简单,一文带你玩转接口自动化上(Python + Pytest + Requests + Allure )

一. 前言 哈喽大伙们好&#xff0c;好久不见距离上次更新博客已经有一年之久了&#xff0c;这将近一年的时间小编主要的时间都花在了实习和24届校招上面了&#xff0c;最终也是收获满满&#xff0c;选择了一个还不错的offer&#xff0c;感谢一路走来的自己和身边朋友的帮助&…

基于Three.js实现的3D立方体动画

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于Three.js实现的3D立方体动画 应用场景 该代码段适用于需要在网页中创建交互式3D场景的场景。例如&#xff0c;可以用于展示产品、创建游戏或制作视觉效果。 基本功能 此代码段使用Three.js库创建了一个…