QStandardItemModel 和itemChangedSlot 是一对太好的朋友
item发生变化 model 的数据也进行重新设置
QTableWidget *tableWidget = new QTableWidget(10, 5);
// 连接信号槽
QObject::connect(tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(itemChangedSlot(QTableWidgetItem*)));
// 槽函数
void MainWindow::itemChangedSlot(QTableWidgetItem *item)
{
// 处理数据变更
qDebug() << "Item changed at: " << item->row() << ", " << item->column();
}
=======================================================
m_pModel->clear();
PM_TableItemDataList dataList = initUIData();
PM_TableItemData itemData;
m_pModel->setHorizontalHeaderLabels(initTbHeader());
m_pModel->setRowCount(dataList.count());
for (int var = 0; var < dataList.count(); ++var)
{
itemData = dataList.at(var);
// addTableItemView(var, itemData);
// m_pModel->appendRow(QList<QStandardItem *>() << new QStandardItem(itemData.text));
// qDebug() << __LINE__ << __FUNCTION__ << " :" << itemData.text;
m_pModel->setItem(row, TB_COL_NAME, new QStandardItem(itemData.text));
// 此处是错误的用法,最终会导致数据不能显示
// m_pModel->setData(m_pModel->item(row, TB_COL_NAME)->index(),
// QVariant::fromValue(itemData));
// 此处是正确的用法
m_pModel->item(row, TB_COL_NAME)->setData(QVariant::fromValue(itemData));
}
【来源:https://ligo100.cn/qianduanjishu/179.html,转载请注明】
======================================================
QStandardItemModel,setData和setItem区别
大橘
已于 2023-11-02 10:03:18 修改
阅读量631
收藏
点赞数 1
分类专栏: qt/c++ 文章标签: qt c++
版权
qt/c++
专栏收录该内容
40 篇文章18 订阅
订阅专栏
背景:
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();//= 1
bool model1_bIsSetSuccessed = model1->setHeaderData(0, Qt::Horizontal, QVariant(10));//= true
QString 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));//= false
QString 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();//= 1
bool model3_bIsSetSuccessed = model3->setHeaderData(0, Qt::Horizontal, QVariant(30));//= true
QString 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();//= 1
bool model4_bIsSetSuccessed = model4->setHeaderData(0, Qt::Horizontal, QVariant(40));//= true
QString 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类的操作,反正我觉得无所谓,目前还没发现哪种场景必须用它。
本文完。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u012999461/article/details/134174054