【qt】标准项模型

news2024/9/17 8:45:43

标准项模型

  • 一.使用标准型项模型
    • 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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

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

相关文章

Java 对外API接口开发 java开发api接口如何编写

Java API API&#xff08;Application Programming Interface&#xff09;是指应用程序编程接口&#xff0c;的JavaAPI是指JDK提供的各种功能的Java类 String类 String类的初始化&#xff1a; &#xff08;1&#xff09;使用字符串常量直接初始化 初始化&#xff1a;String s…

沃通国密根证书入根红莲花浏览器,共建国密HTTPS应用生态

近日&#xff0c;沃通CA与海泰方圆红莲花安全浏览器进一步达成合作&#xff0c;沃通新增国密根证书入根红莲花安全浏览器。此次入根合作&#xff0c;标志着沃通国密数字证书产品兼容性再次得到提升&#xff0c;进一步夯实国密应用根基。 沃通CA入根红莲花浏览器&#xff0c;自动…

什么是谷歌留痕?

其实它就是指你的网站在谷歌中留下的种种痕迹&#xff0c;无论你是在做外链&#xff0c;还是优化网站内容&#xff0c;或是改善用户体验&#xff0c;所有这些都会在谷歌的搜索引擎里留下一些“脚印”&#xff0c;用比较seo一点的说法&#xff0c;指的是网站在其构建和优化过程中…

ARM|DSP+FPGA+NVIDIA AI摄像头定制

信迈拥有高性能的摄像头全栈能力&#xff1a;掌握车载模组光学设计能力&#xff0c;具有多名经验丰富光学设计专家&#xff1b;具备丰富的车载摄像模组硬件设计经验&#xff1b;掌握目前市面上大部分车载平台的ISP图像画质服务能力&#xff0c;能自主开发图像ISP和增强算法&…

大厂程序员离职,开发一个盲盒小程序2万,一周开发完!

大家好&#xff0c;我是程序员小孟&#xff01; 前面接了一个盲盒的小程序&#xff0c;主要的还是商城&#xff0c;盲盒的话只是其中的有一个活动。 现在的年轻人是真的会玩&#xff0c;越来越新的东西出来&#xff0c;越来越好玩的东西流行。 就像最近很火的地摊盲盒。 讲…

Linux配置nginx代理功能

ywtool运维工具下载链接及介绍: 工具下载/介绍/安装页面 目录 一.nginx proxy功能介绍二.配置nginx proxy功能2.1 新增nginx代理配置2.1.1 反向代理(当前只举例https转https)2.1.2 负载均衡(当前只举例https转https) 2.2 修改nginx代理配置2.2.1 手动修改配置文件2.2.2 通过此脚…

【图书推荐】《Vue.js 3.x+Element Plus从入门到精通(视频教学版)》

本书用处 内容简介 本书通过对Vue.js&#xff08;简称Vue&#xff09;的示例和综合案例的介绍与演练&#xff0c;使读者快速掌握Vue.js 3.x框架的用法&#xff0c;提高Web前端的实战开发能力。本书配套示例源码、PPT课件、教学大纲、教案、同步教学视频、习题及答案、其他资源…

插件“猫抓”使用方法 - 浏览器下载m3u8视频 - 合并 - 视频检测下载 - 网课下载神器

前言 浏览器下载m3u8视频 - 合并 - 网课下载神器 chrome插件-猫抓 https://chrome.zzzmh.cn/info/jfedfbgedapdagkghmgibemcoggfppbb 步骤&#xff1a; P.s. 推荐大佬的学习视频&#xff01; 《WEB前端大师课》超级棒&#xff01; https://ke.qq.com/course/5892689#term_id…

水面漂浮物生活垃圾识别检测系统

水面漂浮物生活垃圾识别检测系统通过现场监控摄像机对河道湖面等水体进行实时监测&#xff0c;水面漂浮物生活垃圾识别检测系统借助智能视频分析技术和YOLO深度学习技术&#xff0c;系统能够自动识别和抓拍水面上的垃圾漂浮物。一旦系统检测到有垃圾漂浮在水面上&#xff0c;立…

Android-自定义三角形评分控件

效果图 序言 在移动应用开发中&#xff0c;显示数据的方式多种多样&#xff0c;直观的图形展示常常能带给用户更好的体验。本文将介绍如何使用Flutter创建一个自定义三角形纬度评分控件&#xff0c;该控件可以通过动画展示评分的变化&#xff0c;让应用界面更加生动。 实现思…

Pantera 合伙人简谈 Morpho:更高效、适应性更强的 DeFi 解决方案

原文标题&#xff1a;《Pioneering Peer-to-Peer Lending in the DeFi Revolution》撰文&#xff1a;Pantera Capital 合伙人 Paul Veradittakit编译&#xff1a;Chris&#xff0c;Techub News 文章来源&#xff1a;香港Web3媒体Techub News Morpho 正在超越 Compound 等传统…

linux系统安全加固

目录 1、账户安全基本措施 1&#xff09;系统账户清理 2&#xff09;密码安全控制 3&#xff09;命令历史限制 2、用户切换及提权 1&#xff09;使用 su命令切换用户 2&#xff09;使用sudo机制提升权限 3、系统引导和安全登录控制 1&#xff09;开机安全控制 2&…

亚马逊卖家账号注册复杂吗?需要什么辅助工具吗?

在当今数字化的商业世界中&#xff0c;亚马逊作为全球最大的电商平台之一&#xff0c;吸引着无数的卖家和买家。对于想要进入亚马逊销售市场的卖家来说&#xff0c;首先要完成的一项重要任务就是注册亚马逊卖家账号。本文将详细介绍亚马逊注册的步骤、所需时间&#xff0c;以及…

Advanced Installer 使用教程-注册表的读写

一、写入 1、注册表的写入&#xff1a;点击左侧“注册表”&#xff0c;在配置单元注册表的条目上右击选择“新建项”&#xff0c;填入新建项名称&#xff0c;如下图新建了一个“InstallerManager”项 2、在刚才的新建项上右击选择“新建值”&#xff0c;在弹出的窗口中填入名称…

微服务框架Go-kit 01 - 基础示例

一、Go kit简介 Go kit 是一个用于构建可扩展、灵活和可维护微服务的框架和工具集合。它提供了一系列库和组件&#xff0c;涵盖了微服务开发的各个方面&#xff0c;包括服务发现、负载均衡、通信、日志记录、请求跟踪、限流、熔断等。 Go kit 构建微服务时遵循一种类似于传统…

java/php/node.js/python农业技术学习平台【2024年毕设】

本系统带文档lw万字以上 文末可领取本课题的JAVA源码参考 开发环境 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;ssmvue JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7或8.0 数据库工具&#xff1a;Navicat11 …

AI绘画Stable Diffusion 一键打造网红黏土风格图片,本地部署免费使用!

大家好&#xff0c;我是画画的小强 最近社交平台正在被一股全新的创作潮流所席卷&#xff0c;这就是“黏土AI”的狂潮。这种丑陋但又可爱的风格已经成为网民们热议的话题。无论是在小红书还是其他社交平台上&#xff0c;诸如#黏土、#我的黏土世界等标签都被这种新奇的创作风格…

Flink-cdc更好的流式数据集成工具

What’s Flink-cdc? Flink CDC 是基于Apache Flink的一种数据变更捕获技术&#xff0c;用于从数据源&#xff08;如数据库&#xff09;中捕获和处理数据的变更事件。CDC技术允许实时地捕获数据库中的增、删、改操作&#xff0c;将这些变更事件转化为流式数据&#xff0c;并能够…

客厅落地台灯怎么摆放好?五款精品护眼落地灯分享

客厅落地台灯怎么摆放好&#xff1f;在追求品质生活的今天&#xff0c;许多人都选择入手了落地台灯&#xff0c;它不仅能够帮助补充光线&#xff0c;还能够提供敞亮的照明效果&#xff0c;特别在采光不是很好的地方&#xff0c;而客厅落地台灯怎么摆放好&#xff1f;其实大路灯…

SQL刷题笔记day1

1题目 我的代码&#xff1a; select * from employees order by hire_date desc limit 2,1 标准代码&#xff1a; select * from employees where hire_date (select distinct hire_date from employees order by hire_date desc limit 2,1) 复盘&#xff1a;因为按照入…