【qt】标准型模型 下

标准型模型

  • 一.前言
  • 二.预览数据
    • 1.获取表头
    • 2.获取数据项
  • 三.保存文件
    • 1.文件对话框获取保存文件名
    • 2.用文件名初始化文件对象
    • 3.打开文件对象
    • 4.用文件对象初始化文本流
    • 5.写入数据
  • 四.格式
    • 1.居右
    • 2.居中
    • 3.居左
    • 4.粗体
  • 五.模型的信号
    • 1.解决粗体action问题
    • 2.状态栏显示信息
  • 六.总结

一.前言

书接上回,我们已经实现了导入文件,添加行,插入行,删除行,接下来,我们开始实现接下来的功能。

在这里插入图片描述

二.预览数据

1.获取表头

void MainWindow::on_actionSee_triggered()
{ui->plainTextEdit->clear();//把上次显示的清空QString str;for(int i=0;i<colCount;i++){auto item=model->horizontalHeaderItem(i);//拿到表头的每项数据str+=item->text()+"\t\t";//将每项的内容加到字符串中}ui->plainTextEdit->appendPlainText(str);//添加到文本编辑器里
}

运行结果:
在这里插入图片描述

2.获取数据项

接下来就是拿到数据项了,表格类似于二维数组,所有我们可以用两次for循环来拿。

for(int i=0;i<model->rowCount();i++){str="";//每一行都从空字符串相加for(int j=0;j<colCount-1;j++)//最一列单独处理{auto item=model->item(i,j);str+=item->text()+"\t\t";}auto item=model->item(i,colCount-1);//最后一列if(item->checkState()==Qt::Checked)//根据是否勾选来选择{str+="是";}else{str+="否";}ui->plainTextEdit->appendPlainText(str);//会自动换行}

运行结果:
在这里插入图片描述

三.保存文件

1.文件对话框获取保存文件名

//获取保存文件名QString fileName=QFileDialog::getSaveFileName(this,"保存文件",QCoreApplication::applicationDirPath());

防御性编程:

if(fileName.isEmpty())//如果文件名为空,就直接返回{return;}

2.用文件名初始化文件对象

 QFile qFile(fileName);

3.打开文件对象

用读写和文本和截断的方式打开,截断就是打开时里面有文件就清空

 if(!qFile.open(QIODevice::ReadWrite|QIODevice::Text|QIODevice::Truncate))//通过打不开文件直接返回{return;}

4.用文件对象初始化文本流

QTextStream stream(&qFile);

5.写入数据

其实就跟刚刚预览数据的时候一样,只是这里是往文件里面进行添加

QString str;for(int i=0;i<colCount;i++){auto item=model->horizontalHeaderItem(i);//拿到表头的每项数据str+=item->text()+"\t\t";//将每项的内容加到字符串中}stream<<str<<"\n";//写入文件中for(int i=0;i<model->rowCount();i++){str="";//每一行都从空字符串相加for(int j=0;j<colCount-1;j++)//最一列单独处理{auto item=model->item(i,j);str+=item->text()+"\t\t";}auto item=model->item(i,colCount-1);if(item->checkState()==Qt::Checked){str+="是";}else{str+="否";}stream<<str<<"\n";//写入文件中

运行结果保存的文:
在这里插入图片描述

四.格式

1.居右

默认单元格内容居左,所以我们先来实现居右的功能

void MainWindow::on_actionRight_triggered()
{if(!selectionModel->hasSelection())//没有选择就直接退出{return;}auto indexs=selectionModel->selectedIndexes();//通过选择模型可以获取选择的多个单元格的模型索引for(int i=0;i<indexs.count();i++){QStandardItem * item=model->itemFromIndex(indexs[i]);//通过模型索引获取项item->setTextAlignment(Qt::AlignVCenter|Qt::AlignRight);//设置文本对其方式为右对其,垂直居中}
}

注释我写的很详细我就不讲了,auto是我偷懒的写法,如果你们要写具体的类型可以点进函数看。
在这里插入图片描述

2.居中

同理,只是文本对齐参数不一样

 void MainWindow::on_actionMiddle_triggered()
{if(!selectionModel->hasSelection())//没有选择就直接退出{return;}auto indexs=selectionModel->selectedIndexes();//通过选择模型可以获取选择的多个单元格的模型索引for(int i=0;i<indexs.count();i++){QStandardItem * item=model->itemFromIndex(indexs[i]);//通过模型索引获取项item->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter);//只是这里参数不一样}
}

运行结果:
在这里插入图片描述

3.居左

void MainWindow::on_actionLeft_triggered()
{   if(!selectionModel->hasSelection())//没有选择就直接退出{return;}auto indexs=selectionModel->selectedIndexes();//通过选择模型可以获取选择的多个单元格的模型索引for(int i=0;i<indexs.count();i++){QStandardItem * item=model->itemFromIndex(indexs[i]);//通过模型索引获取项item->setTextAlignment(Qt::AlignVCenter|Qt::AlignLeft);}
}

4.粗体

粗体action是复选框,用这个信号
在这里插入图片描述

void MainWindow::on_actionBold_triggered(bool checked)
{if(!selectionModel->hasSelection())//没有选择就直接退出{return;}auto indexs=selectionModel->selectedIndexes();//通过选择模型可以获取选择的多个单元格的模型索引for(int i=0;i<indexs.count();i++){QStandardItem * item=model->itemFromIndex(indexs[i]);//通过模型索引获取项QFont font=item->font();font.setBold(true);item->setFont(font);}
}

运行结果:
在这里插入图片描述

五.模型的信号

1.解决粗体action问题

但是现在有一个问题,那就是我点粗体action之后,他不会变化,当我选择另外一个单元格的时候,他还是一直选中的,明显不合理,我明明就没有粗体。
就像这样,不是粗体但是复选框也是打开的。
在这里插入图片描述
这个时候我们就需要动态的来控制粗体按钮的开与关了。
当我们选择另一个单元格的时候,选择模型就可以发出信号,所以我们来使用选择模型的信号。
因为模型不是ui界面所以只能我们手动关联,和写槽函数。

选信号可以到选择模型里面去找。
在这里插入图片描述
槽函数:

void on_currentChanged(const QModelIndex &current, const QModelIndex &previous);

信号槽关联:

connect(selectionModel,SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)),this,SLOT(on_currentChanged(const QModelIndex &, const QModelIndex &)));

槽函数的实现:

void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
{if(current.isValid())//如果当前点击的单元格是有效的。{auto item=model->itemFromIndex(current);//通过当前模型索引获取单元格ui->actionBold->setChecked(item->font().bold());//如果是粗体就打开,不是就关闭}
}

就很nice可以去玩玩。

2.状态栏显示信息

statusBar()->addWidget(labelInfo);//状态栏添加一个标签

还是在选择变化的槽函数里面

void MainWindow::on_currentChanged(const QModelIndex &current, const QModelIndex &previous)
{if(current.isValid())//如果当前点击的单元格是有效的。{auto item=model->itemFromIndex(current);//通过当前模型索引获取单元格ui->actionBold->setChecked(item->font().bold());//如果是粗体就打开,不是就关闭labelInfo->setText(QString::asprintf("单元格信息:行:%d  列:%d",current.row(),current.column())+"  内容:"+item->text());}
}

运行结果:
在这里插入图片描述

六.总结

对于这些功能的处理,拿到item,可以通过行和列坐标,可以通过模型索引。对于上节的内容,我们主要是设置item。所以对于我们学过的东西一定要找相似点,要总结一下。
好了,标准项模型和选择模型就讲到这里了。

慌了,你就慢下来,还慌,你就停下来!

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

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

相关文章

C++容器之无序集(std::unordered_set)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 iterators3.4 capacity3.5 find3.6 count3.7 equal_range3.8 emplace3.9 emplace_hint3.10 insert3.11 erase3.12 clear3.13 swap3.14 bucket_count3.15 max_bucket_count3.16 bucket_size3.17 bucket3.18 load_fa…

Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器

​【应用名称】&#xff1a;Kiwi浏览器 - 支持 Chrome 扩展的安卓浏览器 ​【适用平台】&#xff1a;#Android ​【软件标签】&#xff1a;#Kiwi ​【应用版本】&#xff1a;124.0.6327.2 ​【应用大小】&#xff1a;233MB ​【软件说明】&#xff1a;一款基于开源项目 Chr…

vue3 vite动态根据字符串加载组件

1 原理 import.meta.glob() 其实不仅能接收一个字符串&#xff0c;还可以接收一个字符串数组&#xff0c;就是匹配多个位置 let RouterModules import.meta.glob(["/src/view/*/*.vue", "/src/view/*.vue"]);这样我们就拿到了相对路劲的组件对象&#xf…

[激光原理与应用-93]:激光焊接检测传感器中常用的聚焦镜、分色镜、分光镜、滤波镜

目录 一、聚焦镜 1.1 原理及作用 1.2 性能指标 1.3 应用 1.4 类型 二、分色镜 2.1 原理及应用 2.2 种类 2.3 特点 2.4 注意事项 2.5 性能指标 三、分光镜 ​编辑 3.1 分光镜的类型 3.2 分光镜的工作原理 3.3 分光镜的应用 3.4 分光镜的参数 3.5 分光镜的优点…

物业可视化大屏,终于让繁琐数据一手掌握啦。

物业可视化大屏通常需要展示与物业管理相关的数据&#xff0c;以便管理人员和业主能够实时监控和分析物业运营情况。以下是一些常见的物业可视化大屏所展示的数据类别&#xff1a; 1. 房产信息&#xff1a; - 房产总数、出租率、空置率等。- 房产面积分布情况。- 房产类型、户…

ES升级--01--环境准备和安装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Linux 单机1.官网下载 Elasticsearchhttps://www.elastic.co/cn/downloads/past-releases/#elasticsearch 2.解压软件3.创建用户设置用户 es 密码 es赋权ES用户数据…

MySQL——约束与表的设计基础

前言 本篇文章主要介绍数据库约束以及数据库中有关表设计的一些基础知识&#xff0c;文章会尽量都用实例进行直观的讲解与展示每个知识点的意义&#xff0c;现在就开始今天的学习吧&#xff01;&#xff01; 一、数据库约束 1.约束概述 约束&#xff0c;就是在创建表的时候给…

Spring Boot 01:Spring Boot 项目的两种创建方式

一、前言 记录时间 [2024-05-25] 本文讲述 Spring Boot 项目的两种创建方式&#xff0c;分别是 IDEA 和官网。 由 Spring 官网知&#xff0c;当前 Spring Boot 的最新版本为 3.3.0&#xff0c;需要最低 JDK 版本为 17。 Spring 官网项目创建地址JDK 17 版本下载地址 准备工作…

软考-下午题-试题二、三

主要是最后一问的不同解答 1、父图子图平衡 1、员工关系是否存在传递依赖&#xff1f;用100字以内的文字说明理由。2019 2、在职员关系模式中&#xff0c;假设每个职员有多名家属成员&#xff0c;那么职员关系模式存在什么问题&#xff1f; 应如何解决&#xff1f;2020 职员关系…

二十八篇:嵌入式系统实战指南:案例研究与未来挑战

嵌入式系统实战指南&#xff1a;案例研究与未来挑战 1. 引言 1.1 嵌入式系统的重要性及其应用广度 在当今快速发展的技术领域中&#xff0c;嵌入式系统扮演着至关重要的角色。这些系统是专门设计的计算机硬件和软件的组合&#xff0c;旨在执行特定任务&#xff0c;如控制、监…

青鸟云报修系统:实现高效、便捷的维修申请处理

在日常生活和工作中&#xff0c;故障报修难免会遇到&#xff0c;售后报修服务则成为了解决问题的关键。纸质化售后报修维修申请单&#xff0c;作为报修流程中的重要一环&#xff0c;在一定程度上能够记录和追踪售后报修维修流程&#xff0c;但在实际操作过程中却存在着诸多弊端…

速看!!!24上软考-信息系统项目管理师真题回忆,考点已更新

整理了24上半年软考高级信息系统项目管理师的考试真题&#xff0c;软考一个批次一套题&#xff0c;现在都是机考&#xff0c;收集题目比较困难&#xff0c;希望能给个小小的赞支持一下。 注意&#xff1a;当天考试的宝子们可以对答案预估分数&#xff01;后面场次的宝子可以提…

llama-factory学习个人记录

框架、模型、数据集准备 1.llama-factory部署 # 克隆仓库 git clone https://github.com/hiyouga/LLaMA-Factory.git # 创建虚拟环境 conda create --name llama_factory python3.10 # 激活虚拟环境 conda activate llama_factory # 安装依赖 cd LLaMA-Factory pip install -…

Java虚拟机揭秘-底层驱动力,性能保障!

Java虚拟机作为Java技术体系的核心组成部分&#xff0c;其重要性不言而喻。它不仅为Java提供了跨平台的能力&#xff0c;更是Java程序运行的基石。本文将为您深入解析Java虚拟机的工作原理、作用和应用场景&#xff0c;并通过生动的实例让您彻底理解这一关键技术。 一、Java虚拟…

element-plusDate Picker 日期选择器获取年月日

代码逻辑 对选择日期选择后进行搜索 &#xff1a; function dataValue(value) {console.log(value);scenic_list.value arrlist.value.filter(function (item) {// 判断是否满足搜索条件if (String(item.create_time).indexOf(String(value)) > -1) {return scenic_list}}…

SpringMVC流程

1、SpringMVC常用组件&#xff1a; DispatcherServlet&#xff08;请求分发器&#xff09;&#xff1a;Spring MVC的核心组件之一&#xff0c;负责处理全局配置和将用户请求分发给其他组件进行处理。Controller&#xff08;处理器&#xff09;&#xff1a; 实际处理业务逻辑的…

B站滑块登录之极验点选

滑块登录这些东西都不是很难&#xff0c;我个人的去处理的话一般会考虑三种方案&#xff0c;一个是自动化selenium 二是各类打码平台 三是ocr识别&#xff0c;本文是selenium接打码平台&#xff0c;也是个比较常规的操作。 先常规步骤跟着来吧&#xff0c;做登录的话把基本的模…

Tower在深度学习中的概念,tower没有确切定义

在论文UniTS中&#xff0c;来自Havard的工作。 tower更像是针对一个task的组件 tower这个概念貌似在REC&#xff08;recommendation&#xff09;推荐系统中使用较多 deep learning - What is a tower? - Data Science Stack Exchange https://developers.google.com/machin…

技术前沿 |【VL-BEIT:引领未来的极简单阶段多模态预训练方案】

VL-BEIT&#xff1a;引领未来的极简单阶段多模态预训练方案 引言一、VL-BEIT的基本介绍二、VL-BEIT的原理和工作方式三、VL-BEIT的特点四、VL-BEIT的应用场景五、总结与展望 引言 在人工智能蓬勃发展的今天&#xff0c;多模态预训练模型正逐渐成为研究和应用的热点。这些模型能…

二叉树OJ题目

一.二叉树第k层结点个数 有这样的一个思路&#xff1a;我既然要求第k层的结点个数&#xff0c;我肯定是要用到递归&#xff0c;那么当我在递归到第k层的时候我就开始判断&#xff0c;这一层是不是我所需要的那一层&#xff0c;如果是&#xff0c;就计数有几个节点&#xff0c;…