QStandardItemModel,setData和setItem区别

2023-11-02 10:36

本文主要是介绍QStandardItemModel,setData和setItem区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

model存储数据,用于同步view显示。数据节点全部是item。对象树结构。但是一些常用的函数的特征和用法,手册中没有提及太多,于是记录备忘。

主要包括:

setRowCount,setColumnCount

setItem,setVerticalHeaderItem,setHorizontalHeaderItem

setData,setHeaderData

当然还有很多函数,不用逐一列举,本次记录的是我认为容易有歧义的,分为item类和data类。

model的容量:

model可以通过构造函数或setRowCount/setColumnCount函数,设置行数和列数,但仅仅是设置了“容量”,并没有item(数据实体)。

model的数据实体:

model的setItem,setVerticalHeaderItem,setHorizontalHeaderItem函数,如果需要,会自动“撑开”容量,一旦设置,就相当于有了数据实体,哪怕是空值。

item是个对象,里面可以有多个“字段/角色”来存储数据。其中text可以直接设置和读取,其它类型数据可以用ItemRole区分,随便使用,很灵活。

data函数:

model的setData,setHeaderData函数,“容量”允许时,可以创建并给item赋值,但不能自动“撑开”容量,所以依赖“容量”。如果“容量”不允许,执行失败返回false。

相比item,我想为什么setItem是void没有返回值,因为必然成功。而setdata需要bool返回值,因为不一定成功。

实践:

所以写了下面代码用于测试:

#include "mainwindow.h"
#include <QApplication>
#include <QStandardItemModel>int main(int argc, char *argv[])
{//1:QStandardItemModel *model1 = new QStandardItemModel;model1->setHorizontalHeaderItem(0, new QStandardItem("text1"));//setItem会自动创建“行/列”,此时item.text()="item1"int model1_iColCount = model1->columnCount();//= 1bool model1_bIsSetSuccessed = model1->setHeaderData(0, Qt::Horizontal, QVariant(10));//= trueQString model1_sHeaderData = model1->headerData(0, Qt::Horizontal).toString();//= "10"QString model1_sItemText = model1->horizontalHeaderItem(0)->text();//= "10",setData自动创建了item并赋了值,覆盖了“text1”//2:QStandardItemModel *model2 = new QStandardItemModel;//默认没有“行/列”bool model2_bIsSetSuccessed = model2->setHeaderData(0, Qt::Horizontal, QVariant(20));//= falseQString model2_sHeaderData = model2->headerData(0, Qt::Horizontal).toString();//= ""int model2_iColCount = model2->columnCount();//= 0//3:QStandardItemModel *model3 = new QStandardItemModel;model3->setColumnCount(1);//显式设置列数int model3_iColCount = model3->columnCount();//= 1bool model3_bIsSetSuccessed = model3->setHeaderData(0, Qt::Horizontal, QVariant(30));//= trueQString model3_sHeaderData = model3->headerData(0, Qt::Horizontal).toString();//= "30"QString model3_sItemText = model3->horizontalHeaderItem(0)->text();//= "30",setData自动创建了item并赋了值//4:QStandardItemModel *model4 = new QStandardItemModel(0, 1);//构造时设置“行/列”数int model4_iColCount = model4->columnCount();//= 1bool model4_bIsSetSuccessed = model4->setHeaderData(0, Qt::Horizontal, QVariant(40));//= trueQString model4_sHeaderData = model4->headerData(0, Qt::Horizontal).toString();//= "40"QString model4_sItemText = model4->horizontalHeaderItem(0)->text();//= "40",setData自动创建了item并赋了值delete model1;delete model2;delete model3;delete model4;return 0;
}

显然,setItem是自动的,随心所欲,setData是依赖model行和列的数量的,如果setData成功,会创建和更新相应的item,返回true。否则返回false,一切无效,但不报错。这也是特别要注意的。如果不小心使用了它,没有判断返回值,一旦出错,一时很难定位。

我的体会:

最好直接操作model和item,并充分理解对象树,所谓data类的操作,反正我觉得无所谓,目前还没发现哪种场景必须用它。

本文完。

这篇关于QStandardItemModel,setData和setItem区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/330006

相关文章

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor