为tableview添加带控件的单元格如复选框checkbox与combbox单元格

news2024/11/13 9:40:35

我们常常会有这样的需求,为QTableView增加复选框checkbox和选择下拉框combbox,毕竟依靠键盘输入不是很好约束其规范性。下面我们逐个来介绍。完成之后的效果如下:
在这里插入图片描述

一、准备TableView

1、数据准备

数据大家可以随意准备,有的话有自己的数据,没有的话就用网上的在线数据生成,这样的网站比较多了,搜索一下就可以找到,我这个就是网上自动生成的,自己增加了一个表头而已。
需要测试的也可以拿我这份:

ID	介绍人	姓名	江湖名称	性别	英文名	入会
wangabao        丹丽棠  王阿宝	欧阳阿宝	男性	aaron_abbott	0
liabian 翦国诚  李阿扁  百里阿扁	女性	abby_acevedo	1
zhangabin       帅超雄  张阿宾  淳于阿宾	男性	abdul_acosta	0
liuacai 崇军君  刘阿才  澹台阿才	女性	abe_adams	0
chenacai        晋军君  陈阿财  第五阿财	男性	abel_adkins	1
yangachun       丹理达  杨阿春  东方阿春 	男性	abigail_aguilar	0
huangacong      帅宝麟  黄阿聪  独孤阿聪	女性	abraham_aguirre	0
wuada   崇宝麟  吴阿达  端木阿达	女性	ada_albert	1
zhaoada 邱津晶  赵阿大  段干阿大	男性	adam_alexander	1
zhouae  植丽棠  周阿娥  公孙阿娥	女性	adan_alford	1

2、界面和Model&View准备

在这里插入图片描述

完成界面的控件拖放后,直接在窗体构造函数中写代码

    setCentralWidget(ui->TableView);
    theModel = new QStandardItemModel(this);//数据模型
    theSelection = new QItemSelectionModel(theModel);//选择模型
    ui->TableView->setModel(theModel);//数据模型
    ui->TableView->setSelectionModel(theSelection);//选择模型

3、普通tableview的加载

tableview实现的关键代码:

    int rowcount=filedata.count();
    theModel->setRowCount(rowcount-1);
    QString header=filedata.at(0);
    QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
    theModel->setHorizontalHeaderLabels(headerList);
    QString oneRowTextlist;
    QStandardItem   *mitem;
    QStringList     contentList;

    int i,j;
    for (i=1;i<rowcount;i++) {
        oneRowTextlist=filedata.at(i); //从filedata中获取一行的内容
        contentList=oneRowTextlist.split(QRegExp("\\s+"),QString::SkipEmptyParts);//一个或多个空格、TAB等分隔符隔开的字符串分解为多个字符串
        for (j=0;j<6;j++)
        {
            mitem=new QStandardItem(contentList.at(j));//创建item
            theModel->setItem(i-1,j,mitem); //为模型的i行j列位置设置Item
        }

这里实现的tableview就是我们最常见的表格,双击修改:
在这里插入图片描述
缺点很显然,对于逻辑值输入可以很随意,不利于后面的数据存储。

二、增加复选框checkbox

我们首先为“入会”栏增加复选框。
复选框的增加QStandardItemModel已经提供了,应该说是最容易的了。调用QStandardItemModel的setitem及配合setCheckable可完成。

int rowcount=filedata.count();
    theModel->setRowCount(rowcount-1);
    QString header=filedata.at(0);
    QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
    theModel->setHorizontalHeaderLabels(headerList);
    QString oneRowTextlist;
    QStandardItem   *mitem,*checkItem;
    QStringList     contentList;
    int i,j;
    for (i=1;i<rowcount;i++) {
        oneRowTextlist=filedata.at(i); //从filedata中获取一行的内容
        contentList=oneRowTextlist.split(QRegExp("\\s+"),QString::SkipEmptyParts);//一个或多个空格、TAB等分隔符隔开的字符串分解为多个字符串
        for (j=0;j<7;j++)
        {
            mitem=new QStandardItem(contentList.at(j));//创建item
            theModel->setItem(i-1,j,mitem); //为模型的i行j列位置设置Item
        }
        checkItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,设置
        checkItem->setCheckable(true);

        checkItem->setCheckState((contentList.at(j)=="0")?Qt::Unchecked:Qt::Checked);
        theModel->setItem(i-1,j,checkItem); //为模型的某个行列位置设置Item

我们可以看到,入会一栏由0或1变成了复选框了。
在这里插入图片描述

三、增加下拉框commbox

下拉框的增加有很多中方式,这里介绍最简单的一种方式,直接在tableview中增加,其实还是以利用消息槽及自定义下拉框的代理来完成。

//filedata接收来自filecontentString的内容,由读取文本函数完成
int rowcount=filedata.count();
    theModel->setRowCount(rowcount-1);
    QString header=filedata.at(0);
    QStringList headerList=header.split(QRegExp("\\s+"),QString::SkipEmptyParts);
    theModel->setHorizontalHeaderLabels(headerList);
    QString oneRowTextlist;
    QStandardItem   *mitem,*checkItem;
    QStringList     contentList;
    QComboBox* cmb;
    int i,j;
    for (i=1;i<rowcount;i++) {
        oneRowTextlist=filedata.at(i); //从filedata中获取一行的内容
        contentList=oneRowTextlist.split(QRegExp("\\s+"),QString::SkipEmptyParts);//一个或多个空格、TAB等分隔符隔开的字符串分解为多个字符串
        for (j=0;j<6;j++)
        {
            mitem=new QStandardItem(contentList.at(j));//创建item
            theModel->setItem(i-1,j,mitem); //为模型的i行j列位置设置Item
        }
        checkItem=new QStandardItem(headerList.at(j));//最后一列是Checkable,设置
        checkItem->setCheckable(true);

        checkItem->setCheckState((contentList.at(j)=="0")?Qt::Unchecked:Qt::Checked);
        theModel->setItem(i-1,j,checkItem); //为模型的某个行列位置设置Item

        cmb = new QComboBox();
        cmb->addItems({"男性", "女性"});
        cmb->setCurrentText(contentList.at(4));
        cmb->setStyleSheet ("QComboBox { border-radius: 3px;border: 1px ;selection-color: black;selection-background-color: darkgray; } QFrame { border: 0px; } QComboBox::drop-down{background-color: white;}");
        ui->TableView->setIndexWidget(theModel->index(i-1,4),cmb);//直接用tableview来设置Item为combbox

为了使下拉框与tableview表格风格统一,我们这里通过setStyleSheet设置了combbox的风格,效果如下:
在这里插入图片描述

四、读入文本数据代码

1、读入函数

此函数负责将文本数据读入,放入变量filecontentString中供上面提到的tableview的使用,由filedata变量接收;

void MainWindow::getfileStream()
{
    QString curPath,fileName,str;
    curPath=QCoreApplication::applicationDirPath(); //获取应用程序的路径
//调用打开文件对话框打开一个文件
    fileName=QFileDialog::getOpenFileName(this,tr("打开一个文件"),curPath,
                 "井斜数据文件(*.txt);;所有文件(*.*)");

    if (fileName.isEmpty())
        return  ; //
    QStringList fFileContent;//
    QFile file(fileName);  //以文件方式读出
    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream aStream(&file); //用文本流读取文件
        while (!aStream.atEnd())
        {
            str=aStream.readLine();//读取文件的一行
            fFileContent.append(str); //添加到StringList
        }
        file.close();
       filecontentString=  fFileContent;
  }
}

2、中文乱码的处理

使用上面的函数可能会遇到乱码,关键看大家建立工程时使用的是什么编码utf-8还是GBK的,反正中国人就这两者之一,不对你就两个交换一下
第一种方式,可以给文本流增加编码设置

 QTextStream aStream(&file); //用文本流读取文件
        aStream.setCodec("UTF-8");//设置文件流编码方式
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QTextStream aStream(&file); //用文本流读取文件
        aStream.setCodec("UTF-8");//设置文件流编码方式
        while (!aStream.atEnd())
        {
            str=aStream.readLine();//读取文件的一行      
            fFileContent.append(str); //添加到StringList
        }
        file.close();
       filecontentString=  fFileContent;
  }

第二种,可以给文件直接编码设置

 QTextCodec *codec = QTextCodec::codecForName("UTF-8");//添加
 QStringList fFileContent;//
    QTextCodec *codec = QTextCodec::codecForName("utf-8");//添加
    QFile file(fileName);  //以文件方式读出
    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        while (!file.atEnd())
        {   
            str=codec->toUnicode(file.readLine());//读取文件的一行
            fFileContent.append(str); //添加到StringList
        }
        file.close();
       filecontentString=  fFileContent;
  }

有时间,我们再整理其他两种方式实现的tableview中的下拉框。感兴趣的童鞋请继续关注。

五、源代码下载

上面只是给出了关键代码,如果看不明白,可以参看源代码,也许理解更快。
源代码在这里下载

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

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

相关文章

[C语言]柔性数组

目录 1.柔性数组 2.柔性数组的特点 3.柔性数组的使用 1.柔性数组 柔性数组存在于结构体中&#xff0c;当结构体最后一个成员元素为一个未知大小的数组&#xff0c;则称其为柔性数组。 struct s {int a;char arr[];//柔性数组 }; 2.柔性数组的特点 1. 结构中的柔性数…

八、python-高级语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 1. 什么是闭包 2. 闭包的优缺点 3. nonlocal关键字的作用 4. 简单闭包 5. 使用nonlocal关键字修改外部函数的值 6. 使用闭包实现ATM小案例 7. 装饰器概念 8. 装饰器的一般写法 9. 装…

Vue-Router详解

1、前端路由的发展历程 1.1、认识前端路由 路由其实是网络工程中的一个术语&#xff1a; 在架构一个网络时&#xff0c;非常重要的两个设备就是路由器和交换机。当然&#xff0c;目前在我们生活中路由器也是越来越被大家所熟知&#xff0c;因为我们生活中都会用到路由器&…

算法:树状数组详解(c++实现 求解动态数组区间和问题)

文章目录引入树状数组c完整代码引入 什么是树状数组&#xff1f;&#xff1f;&#xff1f; 解决数据压缩里的累积频率&#xff08;Cumulative Frequency&#xff09;的计算问题&#xff0c;现多用于高效计算数列的前缀和&#xff0c; 区间和&#xff0c;这样的问题可以使用树…

Day8 spring 注解开发

1 前言使用注解类代替xml配置&#xff0c;使用注解代理xml中的标签2 标签2.1 用于Bean(类)上的常见注解2.1.1 Component步骤&#xff1a;在xml中配置包扫描&#xff0c;使得spring知道在哪些类上加上Component在特定类上加上Component测试/*** author : msf* date : 2023/1/24*…

#I. 哆啦A梦的时光机(bfs经典习题)

题目说明有一天&#xff0c;大雄和他的伙伴们想穿越时空进行探险&#xff0c;可是时光机却出了一点故障&#xff0c;只能进行有限的时空穿越操作。大雄他们需要从现在出发&#xff0c;到达一个目标时间点进行探险&#xff0c;结束后再返回到现在&#xff0c;他们希望尽可能减少…

Linux——网络编程概述

Q&#xff1a;为什么要网络编程&#xff1f;A&#xff1a;进程间的通信是依赖于Linux内核的&#xff0c;只能适用于单机&#xff0c;而要实现联机&#xff0c;就要用网络编程&#xff0c;网络编程是面向多台设备间的通信网络编程两个重要概念&#xff1a;IP地址和端口&#xff…

微服务拆分之道

背景 微服务在最近几年大行其道&#xff0c;很多公司的研发人员都在考虑微服务架构&#xff0c;同时&#xff0c;随着 Docker 容器技术和自动化运维等相关技术发展&#xff0c;微服务变得更容易管理&#xff0c;这给了微服务架构良好的发展机会。 在做微服务的路上&#xff0…

JavaWeb | JDBC相关API详解 1(含源码阅读)

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JDBC Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&#x…

5、常量与变量

目录 1.数值型变量 &#xff08;1&#xff09;整型常量 &#xff08;2&#xff09;实型常量 2.字符型常量 (1)字符常量 (2) 字符串常量 3. ASCII表 4. 转义符号 5.符号常量 6. 整型变量 &#xff08;1&#xff09;有符号基本整型 &#xff08;2&#xff09;无符号基…

JavaScript Break 和 Continue 语句

文章目录JavaScript Break 和 Continue 语句Break 语句Continue 语句JavaScript 标签笔记列表JavaScript Break 和 Continue 语句 break 语句用于跳出循环。 continue 用于跳过循环中的一个迭代。 Break 语句 我们已经在本教程之前的章节中见到过 break 语句。它用于跳出 swi…

final的一个重要用途-宏变量和未初始化问题

/*** author 张家琛* version 1.0* date 2023/1/24 20:23*/ public class FinalDemo {public static void main(String[] args) {final var a5;System.out.println(a);} } 对于上面的程序来说&#xff0c;变量a其实根本就不存在&#xff0c;这段代码本质上执行的是转换成的&am…

MyBatis知识点笔记

目录 mybatis mapper-locations的作用&#xff1f; mybatis configuration log-impl 作用&#xff1f; resultType和resultMap的区别&#xff1f; 参数 useGeneratedKeys &#xff0c;keyColumn&#xff0c;keyProperty作用和用法 取值方式#和$区别 动态标签有哪些 MyBat…

字节青训前端笔记 | Vite 入门

本节课&#xff0c;讲师将前置介绍有关前端工程基本知识&#xff0c;同时讲解前端构建工具及解决问题&#xff0c;进而引出作为前端构建工具的 Vite 是什么及其在开发过程中的应用。 为什么使用构建工具 前端是有一系列资源组成的&#xff0c;js 代码&#xff0c;css样式&…

ESP32 Micropython编程(Thonny)04---- 人体感应模块

本人持续分享更多关于嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步 最近使用到人体感应模块HC-SR501&#xff0c;这个模块使用十分简单&#xff0c;看下面代码就可以看出了&#xff0c;而且应用广泛&#xff…

Java 优先级队列(堆)

目录1. 优先级队列&#xff08;堆&#xff09;的概念2. 建立大根堆&#xff08;向下调整算法&#xff09;3. 堆插入元素&#xff08;向上调整算法&#xff09;4. 堆删除元素&#xff08;向下调整算法&#xff09;5. 优先级队列PriorityQueue的特性6. 优先级队列PriorityQueue的…

单向环形链表和约瑟夫问题

单向环形链表和约瑟夫问题 Josephu 问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;… n的n个人围坐一圈&#xff0c;约定编号为k&#xff08;1<k<n&#xff09;的人从1开始报数&#xff0c;数到m 的那个人出列&#xff0c;它的下一位又从1开始报数&#xff0c;数…

ubuntu压缩、归档 tar zip gzip的介绍

不同文件需要使用不同的工具进行压缩和解压&#xff0c;可以使用file文件查看是什么类型的文件 file 文件名如图&#xff0c;在第二行看到这个文件是gzip类型的。 文件&#xff1a;gzip 工具&#xff1a;gunzip gunzip是 gnu unzip的缩写。用来解压gzip压缩包。 解压命令 …

linux 内存管理

0.前言 1.了解Linux内存的管理机制(分段分页) 2.了解虚拟内存和物理内存的映射方式 3.了解操作系统内存与磁盘的交互&#xff08;分页机制---》缺页重读机制&#xff0c;用时拷贝机制) 4.应用程序如何高效使用内存和高级程序的设计方法 1.linux物理使用情况 内核区&#x…

动态站点地图提交百度收录

站点地图&#xff08;sitemap&#xff09;是一个网站的结构化数据&#xff0c;搜索引擎可以通过站点地图迅速了解一个网站的内容&#xff0c;加快搜索引擎收录。 一般来说&#xff0c;站点地图是以.xml结尾的静态化文件&#xff0c;例如个人博客和生化环材网的站点地图链接分别…