【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.rhkb.cn/news/331159.html

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

相关文章

HarmonyOS鸿蒙应用开发——安装与配置

今天脑子又抽风&#xff0c;前端转完学后端之后&#xff0c;今天大周末早上醒来突然又想学鸿蒙了&#xff0c;刚好有个比赛需要用到鸿蒙&#xff0c;于是乎我就随便点开b站看了一下鸿蒙视频&#xff0c;然后马上来写这篇博客&#xff0c;后续我的鸿蒙的博客可能会跳着、不连续地…

【Apache Doris】周FAQ集锦:第 4 期

【Apache Doris】周FAQ集锦&#xff1a;第 4 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

学AI绘图【300集SD新课】--Stable Diffusion教程

学AI绘图需要以下步骤&#xff1a; 明确目标和需求&#xff1a;首先明确设计图的目的&#xff0c;是用于展示算法流程、模型结构还是其他目的。选择合适的工具&#xff1a;根据需求选择合适的绘图工具&#xff0c;如Visio、PowerPoint、Adobe Illustrator等。绘制草图&#xf…

uni-app 微信 支付宝 小程序 使用 longpress 实现长按删除功能,非常简单 只需两步

1、先看效果 2、直接上代码 ui结构 <view class"bind" longpress"deleteImage" :data-index"index"><view class"bind_left">绑定设备</view><view class"bind_right"><view class"bind_t…

5.24学习记录

[FSCTF 2023]ez_php2 比较简单的pop链 <?php highlight_file(__file__); Class Rd{public $ending;public $cl;public $poc;public function __destruct(){echo "All matters have concluded";die($this->ending);}public function __call($name, $arg){for…

Linux服务器安装docker,基于Linux(openEuler、CentOS8)

本实验环境为openEuler系统(以server方式安装)&#xff08;CentOS8基本一致&#xff0c;可参考本文) 目录 知识点实验 知识点 实验 查看yum源docker版本 dnf search docker安装docker dnf install dockerdocker --version

VScode SSH连接远程服务器报错

一、报错 通过VScode SSH插件远程连接服务器&#xff0c;输入密码后没有连接成功&#xff0c;一直跳出输入密码界面&#xff0c;在输出界面里&#xff0c;一直是Waiting for server log或者是显示Cannot not find minimist 二、处理 &#x1f431;&#xff1a; 这个时候应该…

【2024最新华为OD-C卷试题汇总】传递悄悄话的最长时间(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; 文章目录 前…

42-2 应急响应之计划任务排查

一、进程排查 进程排查是指通过分析系统中正在运行的进程,以识别和处理恶意程序或异常行为。在Windows和Linux系统中,进程是操作系统的基本单位,因此对于发现和处理恶意软件或异常活动至关重要。恶意程序通常会以进程的形式在系统中运行,执行各种恶意操作,比如窃取信息、破…

自定义RedisTemplate序列化器

大纲 RedisSerializerFastJsonRedisSerializer自定义二进制序列化器总结代码 在《RedisTemplate保存二进制数据的方法》一文中&#xff0c;我们将Java对象通过《使用java.io库序列化Java对象》中介绍的方法转换为二进制数组&#xff0c;然后保存到Redis中。实际可以通过定制Red…

Leetcode刷题笔记2

283. 移动零 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 数据划分、数据分块 利用数组下标充当指针cur&#xff1a;从左往右扫描数组&#xff0c;遍历数组dest&#xff1a;已处理的区间内&#xff0c;非零元素的最后一个位置 一共被分为三个区间 [0,dest] [dest1,cu…

42-3 应急响应之服务排查

一、服务排查 服务是后台运行的进程,可在计算机启动时自动启动,也可暂停和重新启动,且不显示用户界面。它们特别适用于长时间运行的功能,以避免影响其他用户在同一台计算机上的工作。在应急响应中,服务常被恶意软件用作驻留方法。 二、Windows服务排查 打开【运行】对话框…

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…

iPhone实况照片从Windows资源管理器复制的JPG+MOV无法正常还原到iPhone

背景&#xff1a; 之前使用的iPhone 15 Pro&#xff0c;使用的Windows资源管理器当中复制导出的实况照片&#xff0c;复制出来的格式例如IMG_0001.JPG, IMG_0001.MOV。之后手机就卖掉了。现在使用的iPhone 14 Pro Max&#xff0c;想要导回之前备份的实况照片。尝试使用爱思助手…

VBA即用型代码手册:删除Excel中空白行Delete Blank Rows in Excel

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

一篇文章讲透排序算法之希尔排序

希尔排序是对插入排序的优化&#xff0c;如果你不了解插入排序的话&#xff0c;可以先阅读这篇文章&#xff1a;插入排序 目录 1.插入排序的问题 2.希尔排序的思路 3.希尔排序的实现 4.希尔排序的优化 5.希尔排序的时间复杂度 1.插入排序的问题 如果用插入排序对一个逆序…

单片机设计注意事项

1.电源线可以30mil走线&#xff0c;信号线可以6mil走线 2.LDO推荐 SGM2019-3.3,RT9013,RT9193,1117-3.3V。 3.单片机VCC要充分滤波后再供电&#xff0c;可以接0.1uf的电容 4.晶振附件不要走其他元件&#xff0c;且放置完单片机后就放置晶振&#xff0c;晶振靠近X1,X2。

SpringBoot高级原理详解

文章目录 1 SpringBoot自动化配置原理01-SpringBoot2高级-starter依赖管理机制02-SpringBoot2高级-自动化配置初体验03-SpringBoot2高级-底层原理-Configuration配置注解04-SpringBoot2高级-底层原理-Import注解使用105-SpringBoot2高级-底层原理-Import注解使用206-SpringBoot…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

打造AI虚拟伴侣 - 优化方案

第一部分:框架优化概述 1、精确定位: 构建一个高度灵活且用户友好的平台,旨在通过无缝集成多种大型语言模型(LLMs)后端,为用户创造沉浸式的角色交互体验。不仅适配电脑端,还特别优化移动端体验,满足二次元AI虚拟伴侣市场的特定需求。 2、核心功能强化: 增强后端兼容…