【qt】标准项模型

标准项模型

  • 一.使用标准型项模型
    • 1.应用场景
    • 2.界面拖放
    • 3.创建模型
    • 4.配套模型
    • 5.视图设置模型
    • 6.视图属性的设置
  • 二.从文件中拿到数据
    • 1.文件对话框获取文件名
    • 2.创建文件对象并初始化
    • 3.打开文件对象
    • 4.创建文本流并初始化
    • 5.读取文本流
    • 6.关闭文件
    • 7.完整代码
  • 三.为模型添加数据
    • 1.自定义函数
    • 2.模型添加表头
    • 3.模型添加数据
  • 四.模型插入数据
    • 1.尾部添加数据
    • 2.任意位置插入
  • 五.模型删除数据
  • 六.总结一下

一.使用标准型项模型

1.应用场景

标准项是有行有列的,类似于表格,所以标准项模型一般可以用于管理表格类的数据。
还是先上目标效果:
在这里插入图片描述
我们的数据来源于文本文件:
在这里插入图片描述

2.界面拖放

在这里插入图片描述
需要蔬菜的可以dd我。。。

3.创建模型

在mainwindow.h中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>//标准型模型头文件QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;QStandardItemModel* model;
};
#endif // MAINWINDOW_H

文本文件中一共有6列,我们可以定义一个变量来记录
在这里插入图片描述
在mainwindow.cpp中

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);colCount=6;model=new QStandardItemModel(2,colCount);//创建模型初始化行列
}MainWindow::~MainWindow()
{delete ui;
}

4.配套模型

在表格中,无疑我们需要许多的选择,我们可以增加一个项选择模型。
在mainwindow.h中

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QStandardItemModel>//标准型模型头文件
#include <QItemSelectionModel>//项选择模型QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;int colCount;QStandardItemModel* model;QItemSelectionModel*selectionModel;
};
#endif // MAINWINDOW_H

同时,使用标准型模型来初始化项选择模型。

model=new QStandardItemModel(2,colCount);
selectionModel=new QItemSelectionModel(model);

5.视图设置模型

ui->tableView->setModel(model);
ui->tableView->setSelectionModel(selectionModel);

现在就可以看到了:
在这里插入图片描述
表自适应大小(表格组件有讲过哦):

auto hearView=ui->tableView->horizontalHeader();
hearView->setSectionResizeMode(QHeaderView::Stretch);

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

6.视图属性的设置

设置选择模式,按ctrl可以多个,按shift可以矩形选中
设置选择行为,就是点击是行还是列还是单元格。这里是单元格

 ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems);

参数的选择可以F1在线文档去找。

二.从文件中拿到数据

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

头文件记得:

#include <QFileDialog>//文件对话框

第一个参数是父窗口,第二个是文件对话框的名字,第三个是获取应用程序的路径,第四个参数是筛选器。

void MainWindow::on_actionOpen_triggered()
{QString fileName=QFileDialog::getOpenFileName(this,"打开一个文件",QCoreApplication::applicationDirPath(),"文本文件(*.txt);;所有文件(*.*)");
}

运行效果;
在这里插入图片描述

2.创建文件对象并初始化

记得现判断一下,如果没有获取到文件名就直接退出了

 if(fileName.isEmpty()){return;}

用文件名初始化文件对象

QFile qFile(fileName);

3.打开文件对象

用只读和文本的方式打开文件,如果打不开就退出吧。

if(!qFile.open(QIODevice::ReadOnly|QIODevice::Text)){return;}

4.创建文本流并初始化

记得头文件哦。

#include <QTextStream>//文本流
...
QTextStream stream(&qFile);

5.读取文本流

没在文本结尾就一直读,每次读一行,将读到的信息保存到内存变量contents中,纯文本编辑器也添加读的信息。

QStringList contents;
while(!stream.atEnd()){QString line=stream.readLine();contents.push_back(line);ui->plainTextEdit->appendPlainText(line);}

6.关闭文件

qFile.close();

7.完整代码

void MainWindow::on_actionOpen_triggered()
{QString fileName=QFileDialog::getOpenFileName(this,"打开一个文件",QCoreApplication::applicationDirPath(),"文本文件(*.txt);;所有文件(*.*)");if(fileName.isEmpty()){return;}QFile qFile(fileName);if(!qFile.open(QIODevice::ReadOnly|QIODevice::Text)){return;}QTextStream stream(&qFile);QStringList contents;while(!stream.atEnd()){QString line=stream.readLine();contents.push_back(line);ui->plainTextEdit->appendPlainText(line);}qFile.close();
}

运行结果:
在这里插入图片描述
OK,数据我们是拿到了,接下来我们开始将其添加到模型中。

三.为模型添加数据

1.自定义函数

用来初始化模型,用我们刚刚从文本拿到的数据

//添加数据到模型
initModel(contents);

2.模型添加表头

文本文件的第一行为表头,我们优先处理,先拿出第一行,然后用正则表达式来拆开第一行。
"\s+"是跳过多个空白符,QString::SkipEmptyParts是跳过空白字段

void MainWindow::initModel(QStringList contents)
{QString headLine=contents[0];//数据第一行为表头QStringList headList=headLine.split(QRegExp("\\s+"),QString::SkipEmptyParts);model->setHorizontalHeaderLabels(headList);//设置表头标签
}

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

3.模型添加数据

int rows=contents.count();for(int i=1;i<rows;i++)//从1开始,因为表头已经取出了{QString line=contents[i];QStringList list=line.split(QRegExp("\\s+"),QString::SkipEmptyParts);for(int j=0;j<colCount-1;j++){QStandardItem* item=new QStandardItem(list[j]);model->setItem(i-1,j,item);//将数据添加到模型}}

拿到内存中的数据,先拆开,然后添加到QStandarditem中,然后再设置到模型中。
因为最后一列有复选框,所以我们单独进行处理:

QStandardItem* item=new QStandardItem(headList[colCount-1]);item->setCheckable(true);if(list[colCount-1]=="否"){item->setCheckState(Qt::Unchecked);}else{item->setCheckState(Qt::Checked);}model->setItem(i-1,colCount-1,item);

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

四.模型插入数据

1.尾部添加数据

void MainWindow::on_actionAdd_triggered()
{selectionModel->clearSelection();//清空选中的QStringList list={"姚国林","男","管理层","BOSS","100000","婚否"};QList<QStandardItem*> itemList;//插入需要QStandardItem*列表for(int i=0;i<list.count();i++){QStandardItem *item=new QStandardItem(list[i]);itemList.push_back(item);}itemList[colCount-1]->setCheckable(true);//最后一列设置复选框model->insertRow(model->rowCount(),itemList);//在最后一行插入数据QModelIndex index=model->index(model->rowCount()-1,0);//通过模型获取当前插入模型索引selectionModel->setCurrentIndex(index,QItemSelectionModel::Select);//设置刚刚插入的索引
}

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

2.任意位置插入

和尾插基本一样,只是插入位置,是我们当前选中的位置

void MainWindow::on_actionInsert_triggered()
{selectionModel->clearSelection();//清空选中的QStringList list={"姚国林","男","管理层","BOSS","100000","婚否"};QList<QStandardItem*> itemList;//插入需要QStandardItem*列表for(int i=0;i<list.count();i++){QStandardItem *item=new QStandardItem(list[i]);itemList.push_back(item);}itemList[colCount-1]->setCheckable(true);//最后一列设置复选框QModelIndex index=selectionModel->currentIndex();//通过选择模型获取当前模型索引model->insertRow(index.row(),itemList);//在最后一行插入数据selectionModel->setCurrentIndex(index,QItemSelectionModel::Select);//设置刚刚插入的索引
}

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

五.模型删除数据

void MainWindow::on_actionDel_triggered()
{QModelIndex index=selectionModel->currentIndex();//通过选择模型获取当前模型索引if(index.row()==model->rowCount()-1)//如果选中的是最后一行,直接删除{model->removeRow(index.row());}else{model->removeRow(index.row());selectionModel->setCurrentIndex(index,QItemSelectionModel::Select);//以单元格选中的形式}
}

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

六.总结一下

还有一些功能,我们下一接再讲,你们先熟练掌握这些功能。
这节课主要用到的模型是标准项模型,附加一个选择模型。
每个接口不要死记硬背,注意其含义,参数可以到在线文档里面查找。

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

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

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

相关文章

pytorch在docker里面使用GPU

本博客主要介绍如何在容器里面使用pytorch进行推理&#xff0c;训练&#xff0c;同时用上GPU。 1. 前置条件&#xff0c;安装好docker。 2. 安装nvidia-container-toolkit 参考官方文档&#xff1a; Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.…

ctfshow web入门 其他 web396--web412

web396 <?php error_reporting(0); if(isset($_GET[url])){$url parse_url($_GET[url]);shell_exec(echo .$url[host].> .$url[path]);}else{highlight_file(__FILE__); } shell_exec(echo .$url[host].> .$url[path]); 这个是将url的host写入path,也就是说我们的pa…

el-table-column两种方法处理特殊字段,插槽和函数

问题&#xff1a;后端返回的字段为数字 解决办法&#xff1a; {{ row[item.prop] 1 ? "启用" : "禁用" }} {{ row[item.prop] }} 最终果&#xff1a; 另外&#xff1a;如果多种状态时可用函数 {{ getStatus(row[item.prop]) }} {{ row[item.prop…

IO游戏设计思路

1、TCP ,UDP ,KCP ,QUIC TCP 协议最常用的协议 UDP协议非常规的协议&#xff0c;因为需要在线广播&#xff0c;貌似运营商会有一些影响 KCP 基于UDP的协议&#xff0c;GitHub - l42111996/java-Kcp: 基于java的netty实现的可靠udp网络库(kcp算法)&#xff0c;包含fec实现&am…

WEB攻防【2】——ASPX/.NET项目/DLL反编译/未授权访问/配置调试报错

ASP&#xff1a;windowsiisaspaccess .net&#xff1a;windowsiisaspxsqlserver IIS上的安全问题也会影响到 WEB漏洞&#xff1a;本身源码上的问题 服务漏洞&#xff1a;1、中间件 2、数据库 3、第三方软件 #知识点: 1、.NET:配置调试-信息泄绵 2、.NET:源码反编译-DLL…

【openlayers系统学习】3.5colormap详解(颜色映射)

五、colormap详解&#xff08;颜色映射&#xff09; ​colormap​ 包是一个很好的实用程序库&#xff0c;用于创建颜色图。该库已作为项目的依赖项添加&#xff08;1.7美化&#xff08;设置style&#xff09;&#xff09;。要导入它&#xff0c;请编辑 main.js​ 以包含以下行…

【Numpy】深入解析numpy.mat()函数

numpy.mat()&#xff1a;深入探索NumPy中的矩阵类 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简…

Spring Cloud 系列之Gateway:(9)初识网关

传送门 Spring Cloud Alibaba系列之nacos&#xff1a;(1)安装 Spring Cloud Alibaba系列之nacos&#xff1a;(2)单机模式支持mysql Spring Cloud Alibaba系列之nacos&#xff1a;(3)服务注册发现 Spring Cloud 系列之OpenFeign&#xff1a;(4)集成OpenFeign Spring Cloud …

使用霍尔效应传感或磁场传感技术的应用

随着支持技术的增强&#xff0c;使用霍尔效应传感或磁场传感技术的应用目前已变得有效。本技术文档介绍了霍尔效应技术&#xff0c;并对应用进行了回顾&#xff0c;特别是区分霍尔传感器 IC 的主要类型以及它们可以支持的各种传感行为。此外&#xff0c;它还探讨了一些使能技术…

Spring Cache基本使用

Spring 从 3.1 版本开始定义缓存抽象来统一不同的缓存技术&#xff1b;在应用层面与后端存储之间&#xff0c;提供了一层抽象&#xff0c;这层抽象目的在于封装各种可插拔的后端存储( ehcache, redis, guava)&#xff0c;最小化因为缓存给现有业务代码带来的侵入。 一、Spring…

Vue从入门到实战Day11

一、为什么要学Vue3 Vue3官网&#xff1a;简介 | Vue.js 1. Vue3的优势 2. Vue2选项式API vs Vue3组合式API 示例&#xff1a; 二、create-vue搭建Vue3项目 1. 认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了vite(下一代构建工具)&#xff0c;为…

jenkins插件之Warnings

Warnings插件&#xff0c;收集静态分析工具报告的编译器警告或问题&#xff0c;并将结果可视化。它内置了对许多编译器的支持&#xff08;cpp&#xff0c;clang&#xff0c;java等&#xff09;和工具&#xff08;spotbugs&#xff0c;pmd&#xff0c;checkstyle&#xff0c;esl…

Java操作Word文档,根据模板生成文件

Java操作Word文档 poi-tl介绍 官方文档&#xff1a;https://deepoove.com/poi-tl/ poi-tl&#xff08;poi template language&#xff09;是Word模板引擎&#xff0c;使用模板和数据创建很棒的Word文档。 在文档的任何地方做任何事情&#xff08;Do Anything Anywhere&#…

el-select可选择可搜索可输入新内容

需求&#xff1a;el-form-item添加el-select&#xff0c;并且el-select可选择可搜索可输入新内容&#xff0c;并且和其他的el-input做联动&#xff0c;如果是选择&#xff0c;那么el-input自动回填数据并且不可编辑&#xff0c;如果el-select输入新的内容&#xff0c;那么el-in…

【NumPy】关于numpy.transpose()函数,看这一篇文章就够了

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

如何使用 CapSolver 扩展找到 Google reCAPTCHA 站点密钥?

网站安全性在当今至关重要&#xff0c;Google reCAPTCHA 作为防止垃圾邮件和滥用行为的前线防御系统起着关键作用。reCAPTCHA 站点密钥是确保网站交互由人类驱动的唯一标识符。了解如何找到这个密钥对于网站管理员和开发人员来说至关重要。 什么是 reCAPTCHA 站点密钥 reCAPT…

MySQL主从复制(一):主备一致

MySQL主备的基本原理 如图所示就是基本的主备切换流程&#xff1a; 在状态1中&#xff0c; 客户端的读写都直接访问节点A&#xff0c; 而节点B是A的备库&#xff0c; 只是将A的更新都同步过来&#xff0c; 到本地执行。 这样可以保持节点B和A的数据是相同的。 当需要切换的时候…

spark的简单学习一

一 RDD 1.1 RDD的概述 1.RDD&#xff08;Resilient Distributed Dataset&#xff0c;弹性分布式数据集&#xff09;是Apache Spark中的一个核心概念。它是Spark中用于表示不可变、可分区、里面的元素可并行计算的集合。RDD提供了一种高度受限的共享内存模型&#xff0c;即RD…

IDEA连接MySQL后如何管理数据库

上一节讲解了IDEA如何连接MySQL数据库管理系统&#xff0c;接下来我们就可以在IDEA里使用MySQL来管理数据库了。那么如果我们现在还没有创建需要的数据库怎么办&#xff1f;本节就来教大家如何在IDEA连接MySQL后管理数据库(创建/修改/删除数据库、创建/修改/删除表、插入/更新/…

电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…