【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。所以对于我们学过的东西一定要找相似点,要总结一下。
好了,标准项模型和选择模型就讲到这里了。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

visual studio 2022 ssh 主机密钥算法失败问题解决

 Solution - aengusjiang 问题&#xff1a; I follow the document, then check sshd_config, uncomment“HostKey /etc/ssh/ssh_host_ecdsa_key” maybe need add the key algorithms: #HostKeyAlgorithms ssh-ed25519[Redacted][Redacted]rsa-sha2-256,rsa-sha2-512 Ho…

【C++初阶】vector

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

交叉熵损失函数计算过程(tensorflow)

交叉熵损失函数通常用于多类分类损失函数计算。计算公式如下&#xff1a; P为真实值&#xff0c;Q为预测值。 使用tensorflow计算 import tensorflow as tf import keras# 创建一个示例数据集 # 假设有3个样本&#xff0c;每个样本有4个特征&#xff0c;共2个类别 # 目标标签…

【退役之重学Java】关于B+树索引

一、为什么使用索引 一条数据可能有很多字段&#xff0c;数据量比较大&#xff0c;挨个查询效率极差故使用索引&#xff0c;提高查询性能和加快数据检索速度。同时还可以帮助优化排序、分组和连接操作&#xff0c;提高数据库系统的整体性能和响应速度。 二、为什么要用 B 树 B树…

【全开源】点餐小程序系统源码(ThinkPHP+FastAdmin+UniApp)

基于ThinkPHPFastAdminUniApp开发的点餐微信小程序&#xff0c;类似肯德基&#xff0c;麦当劳&#xff0c;喜茶等小程序多店铺模式&#xff0c;支持子商户模式&#xff0c;提供全部前后台无加密源代码和数据库&#xff0c;支持私有化部署。 革新餐饮行业的智慧点餐解决方案 一…

设计模式—23种设计模式重点 表格梳理

设计模式的核心在于提供了相关的问题的解决方案&#xff0c;使得人们可以更加简单方便的复用成功的设计和体系结构。 按照设计模式的目的可以分为三大类。创建型模式与对象的创建有关&#xff1b;结构型模式处理类或对象的组合&#xff1b;行为型模式对类或对象怎样交互和怎样…

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢&#xff1f;很多日常生活中&#xff0c;很多的场景或者物品都会有自己的二维码&#xff0c;其他人通过扫码就可以获取对应的内容。有很多场景下会把视频转换二维码&#xff0c;通过扫码在手机上查看视频内容&#xff0c;比如产品介绍、…

408数据结构-图的基本概念 自学知识点整理

*第六章个人感觉是最难的&#xff0c;请各位抓稳扶手&#xff0c;系好安全带。 图的定义 通俗来讲&#xff0c;一个图由一些点和连接这些点的若干边组成&#xff0c;边的两头必须都有顶点&#xff0c;否则不是图。 注&#xff1a;G: Graph&#xff1b; V: Vertex&#xff1b; …

Hive安装教程

前置条件:hadoop&mysql docker容器安装mysql-CSDN博客 以下的/opt/bigdata目录根据自己实际情况更改 1.上传hive包并解压 tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /opt/bigdata/ 2.修改路径 mv /opt/bigdata/apache-hive-3.1.3-bin/ hive cd /opt/bigdata/hive/…

螺旋矩阵的思想

方阵类型 https://leetcode.cn/problems/spiral-matrix-ii/ lc59: 螺旋矩阵&#xff0c; 解题思路 关键点&#xff1a; 上方&#xff0c; 从左到右&#xff1b; 右侧&#xff0c;从上到下&#xff1b; 下方&#xff0c;从右到左&#xff1b; 左侧&#xff0c; 从下往上&…

加密与解密(第四版)】第二十五章笔记

第二十五章 数据取证技术 25.1 硬盘数据的获取和固定 取证专用的Linux可启动光盘 硬盘复制机 利用取证计算机复制硬盘 手机&#xff08;JTAG&#xff09; 电子数据的固定&#xff08;HASH值&#xff09; 25.2 硬盘的分区和数据恢复 25.3 内存分析 25.4 动态仿真技术 25.…

SpringBoot——整合Thymeleaf模板

目录 模板引擎 新建一个SpringBoot项目 pom.xml application.properties Book BookController bookList.html ​编辑 项目总结 模板引擎 模板引擎是为了用户界面与业务数据分离而产生的&#xff0c;可以生成特定格式的页面在Java中&#xff0c;主要的模板引擎有JSP&…

探索Python编程世界:从基础到实战

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python语言简介与动态特性 代码示例&#xff1a;动态类型与变量命名 二、Python应用领…

【软件设计师】大题

一、数据流图 基础知识 数据流图&#xff08;Data Flow Diagram,DFD&#xff09;基本图形元素&#xff1a; 外部实体&#xff08;External Agent&#xff09; 表示存在于系统之外的对象&#xff0c;用来帮助用户理解系统数据的来源和去向加工&#xff08;Process&#xff09;数…

犀牛8 for Mac/Win:重塑三维建模的新标杆

在数字创意的浪潮中&#xff0c;犀牛8&#xff08;Rhinoceros 8&#xff09;作为一款卓越的三维建模软件&#xff0c;以其强大的功能和出色的性能&#xff0c;在Mac和Windows平台上都赢得了广大设计师和工程师的青睐。 犀牛8不仅继承了前代产品的优秀基因&#xff0c;更在细节…

从 0 开始本地部署大语言模型

1、准备 ● Ollama&#xff1a;ollama.com ● Docker&#xff1a;https://docs.openwebui.com/ 2、下载 Ollama 进入 Ollama 官网&#xff0c;点击 Download 。 下载完成后&#xff0c;双击安装&#xff0c;什么都不需要勾选&#xff0c;直接下一步即可。安装完成&#xf…

[读论文]精读Self-Attentive Sequential Recommendation

论文链接&#xff1a;https://arxiv.org/abs/1808.09781 其他解读文章&#xff1a;https://mp.weixin.qq.com/s/cRQi3FBi9OMdO7imK2Y4Ew 摘要 顺序动态是许多现代推荐系统的一个关键特征&#xff0c;这些系统试图根据用户最近执行的操作来捕获用户活动的“上下文”。为了捕捉…

Hive运行错误

Hive 文章目录 Hive错误日志错误SessionHiveMetaStoreClientql.Driver: FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTaskerror: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster Please check …

GIT 新建分支和合并分支

文章目录 前言一、新建分支二、切回老分支&#xff0c;保留新分支的更改三、合并分支 前言 本文主要针对以下场景进行介绍&#xff1a; 场景一&#xff1a;创建新的分支 当前分支(dev_1)已经开发完毕&#xff0c;下一期的需求需要在新分支(dev_2)上进行开发&#xff0c;如何创…

每日5题Day8 - LeetCode 36 - 40

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;36. 有效的数独 - 力扣&#xff08;LeetCode&#xff09; 题目要求我们进行判断&#xff0c;我们不需要自己填写&#xff0c;所以要一个标志位&#xff0c;来看当…