【qt】自定义对话框

news2024/12/27 18:56:00

自定义对话框

  • 一.自定义对话框的使用
    • 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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

public:
    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.coloradmin.cn/o/1718463.html

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

相关文章

Spring Security3.0版本

前言&#xff1a; 核心&#xff1a; A >> &#xff1f; >> B &#xff1f;代表判断层&#xff0c;由Security实现 这是之前的版本浓缩&#xff0c;现在3.0版本添加了更匹配的内容描写&#xff0c;匹配了mvc模式 非mvc模式 核心&#xff1a;client&#x…

医院该如何应对网络安全?

在线医生咨询受到很多人的关注&#xff0c;互联网医疗行业的未来发展空间巨大&#xff0c;但随着医院信息化建设高速发展 医院积累了大量的患者基本信息、化验结果、电子处方、生产数据和运营信息等数据 这些数据涉及公民隐私、医院运作和发展等多因素&#xff0c;医疗行业办…

客户关系管理系统

CRM系统是协调企业与顾客间在销售、营销和服务关系&#xff0c;提升企业管理水平&#xff0c;向客户提供创新、个性化服务的过程。 最终目标是吸引新客户、保留老客户以及将已有客户转为忠实客户&#xff0c;增加市场份额。 CRM系统开发团队应该深谙“客户关系”的内涵&#xf…

17-java网络编程

目录 第17章 网络编程 17.1 软件结构 17.2 网络通信三要素 17.2.1 IP地址和域名 1、IP地址 2、域名 17.2.2 端口号 17.2.3 网络通信协议 17.3 TCP与UDP协议 17.3.1 UDP协议 17.3.2 TCP协议 1、三次握手 2、四次挥手 17.4 网络编程API 17.4.1 InetAddress类 17.4…

dubbo复习:(19)dubbo 和spring整合(老古董)

一、服务端依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM…

nginx的安装001

Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;以及邮件代理服务器&#xff0c;由 Igor Sysoev 开发并公开发布于2004年。Nginx以其高并发处理能力、低内存消耗和稳定性著称&#xff0c;特别适合部署在高流量的网站上。 操作系统&#xff1a; CentOS Stream 9 安装步骤…

在线图片文字识别转换的软件,分享3个热门的软件!

在数字化时代&#xff0c;图片中的文字信息提取变得愈发重要。无论是从扫描文档、照片还是其他图像中&#xff0c;我们都需要快速、准确地获取其中的文字内容。而在线图片文字识别转换工具&#xff0c;正是解决这一问题的得力助手。本文将为您盘点目前市场上热门的在线图片文字…

DNF手游6月5日更新亮点全解析!

在即将到来的6月5日更新中&#xff0c;《DNF手游》将迎来一系列令人振奋的新内容和玩法。本文将详细介绍本次更新的主要内容&#xff0c;包括新增的组队挑战玩法“罗特斯入门团本”&#xff0c;新星使宠物的推出&#xff0c;宠物进化功能的开放&#xff0c;以及六月下旬即将落地…

初识Spring Boot:构建项目结构与组件解析

目录 前言 第一点&#xff1a;项目的结构 第二点&#xff1a;controller类的创建与使用&#xff08;构造器&#xff09; 第二点&#xff1a;service类的创建与使用&#xff08;逻辑层&#xff09; 第三点&#xff1a;Mapper类的创建与使用(数据操作) 总结 前言 在进行Sp…

flask网页开发之旅:路由与视图函数详解

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;掌握flask网页开发的钥匙 二、路由&#xff1a;连接用户请求与网页内容…

发布-订阅(ZeroMQ) C++实现

1、目的 自从发了《发布-订阅&#xff08;Publish-Subscribe&#xff09;C实现》博文&#xff0c;收到不少反馈&#xff1a;主要的问题就是无法跨主机使用。 本次实现主要解决&#xff1a; 简化ZeroMQ的开发过程&#xff1b;尽可能简化发布订阅的API调用&#xff1b;订阅者消…

【计算机毕设】基于SpringBoot的学生心理咨询评估系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 随着社会的快速发展和竞争压力的增加&#xff0c;学生心理健康问题日益突出。设计和实现一个基于SpringBoot的学生心理咨询评估系统&#xff0c;旨在…

在Ubuntu乌班图上安装Docker

最近在学习乌班图相关的内容&#xff0c;找了一些文档安装的都是报错的&#xff0c;于是记录一下学习过程&#xff0c;希望也能帮助有缘人&#xff0c;首先查看乌班图的系统版本&#xff0c;我的是如下的&#xff1a; cat /proc/version以下是在Ubuntu 20.04版本上安装Docker。…

LeetCode739:每日温度

题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 解题思想 使用单…

Windows Server安全配置

Windows Server操作系统安全配置&#xff0c;加固windows server。 1、密码安全 设置密码最小长度为10 开始-管理工具-本地安全策略-安全设置-账户策略-密码策略&#xff0c;修改密码长度最小值为10。 2、密码使用期限 设置密码最长使用期限为30天 开始-管理工具-本地安全策…

list 的实现

目录 list 结点类 结点类的构造函数 list的尾插尾删 list的头插头删 迭代器 运算符重载 --运算符重载 和! 运算符重载 * 和 -> 运算符重载 list 的insert list的erase list list实际上是一个带头双向循环链表,要实现list,则首先需要实现一个结点类,而一个结点需要…

【Python】解决Python错误报错:IndexError: tuple index out of range

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

宝塔 nginx 配置负载均衡 upstream

nginx 主配置文件加入 upstream myapp1 {server 192.168.124.101:5051;server 192.168.124.102:5052;server 192.168.124.111:5050;}站点配置文件中加入 location / {proxy_pass http://myapp1;}80端口映射到外网域名配置方法 加入红框中的代码 upstream myapp3 {server 192.16…

物联边缘网关有哪些功能?物联边缘网关在工业方向的应用-天拓四方

随着物联网技术的快速发展&#xff0c;越来越多的设备和系统正在接入到网络中&#xff0c;形成了一个庞大的智能生态系统。在这个系统中&#xff0c;物联边缘网关扮演着至关重要的角色&#xff0c;它不仅是连接设备和云端的桥梁&#xff0c;更是推动智能应用落地的关键。在当今…

强烈推荐十款数据防泄密软件,高人气的数据防泄密软件

100G的文件不见了&#xff1f;客户的电话信息被拷贝走了&#xff1f;源代码被竞争对手搞到手了&#xff1f;这些都是严重的数据泄密事件&#xff0c;为此&#xff0c;我们需要数据防泄密软件来全方位保护数据安全。根据当前市场上的热门推荐和综合评价&#xff0c;以下几款数据…