使用前引用头文件
#include <QStandardItem>
#include <QStandardItemModel>
界面设计

创建数据项模型

创建标准数据项

在构造函数中填充数据
listview数据填充:
//for listview
QStandardItemModel *model = new QStandardItemModel();//声明标准数据项模型类对象
//取模型不可见根数据项,模型的数据项只能从根开始添加
QStandardItem *root = model->invisibleRootItem();
//动态循环添加数据
for(int i=0;i<50;i++){
QStandardItem *p = new QStandardItem(
QString::fromLocal8Bit("%1.数据项数据项数据项数据项数据项").arg(i+1));
root->appendRow(p);
}
ui->listView->setModel(model);//设置列表控件数据源
tableview数据填充:
//for tableview
//声明数据项模型为表格 10行 10列
QStandardItemModel *modeltable =new QStandardItemModel(10,10);
modeltable->setHorizontalHeaderLabels(
QStringList()<<QStringLiteral("第1列")
<<QStringLiteral("第2列")
<<QStringLiteral("第3列")
<<QStringLiteral("第4列")
<<QStringLiteral("第5列"));
//遍历表格行与列
for(int r=0;r<10;r++){
for(int c=0;c<10;c++){
QStandardItem *p = new QStandardItem(
QString::fromLocal8Bit("行%0,列%1").arg(r+1).arg(c+1));
modeltable->setItem(r,c,p);//根据行列索引填充数据
}
}
ui->tableView->setModel(modeltable);
treeview数据填充:
//for treeview
QStandardItemModel *modeltree = new QStandardItemModel();
QStandardItem *treeroot = modeltree->invisibleRootItem();
//使用setItem向模型添加数据
QStandardItem *item1 = new QStandardItem(QIcon(":/res/folder.jpg"),"Item1");
QStandardItem *item2 = new QStandardItem(QIcon(":/res/folder.jpg"),"Item2");
model->setItem(0,0,item1);//row col item
model->setItem(1,0,item2);//row col item
//item只能同时给一个模型使用
QStandardItem *item3 = new QStandardItem(QIcon(":/res/folder.jpg"),"Item3");
QStandardItem *item4 = new QStandardItem(QIcon(":/res/folder.jpg"),"Item4");
modeltree->setItem(0,0,item3);//row col item
modeltree->setItem(1,0,item4);//row col item
modeltree->setItem(0,1,new QStandardItem("info1"));//row col item
modeltree->setItem(1,1,new QStandardItem("info2"));//row col item
//生成数据树
for (int i=0;i<5 ;i++ ) {
QStandardItem *item = new QStandardItem(
QString::fromLocal8Bit("节点%1").arg(i+1));
for (int j=0;j<5 ;j++ ) {
QStandardItem *sub = new QStandardItem(
QIcon(":/res/folder.jpg"),
QString::fromLocal8Bit("子节点%1").arg(j+1));
item->appendRow(sub);
}
treeroot->appendRow(item);
treeroot = item;
}
modeltree->setHorizontalHeaderLabels(QStringList()
<<QStringLiteral("标题")
<<QStringLiteral("提示"));
ui->treeView->setModel(modeltree);
ui->treeView->expandAll();//展开所有
//ui->treeView->header()->hide();
treeview节点点击事件实现
QMessageBox::information(this,NULL,
QString::fromLocal8Bit("行%1 列%2 数据:%3 父节点:%4 同行指定列数据:%5")
.arg(index.row())
.arg(index.column())
.arg(index.data().toString())
.arg(index.parent().data().toString())
.arg(index.sibling(index.row(),1).data().toString()));
QModelIndex i = index;
QMessageBox::critical(this,NULL,
QString::fromLocal8Bit("%1")
.arg(getTopParent(i).data().toString()));
根节点遍历查找算法实现:
QStandardItem *DialogStdModel::getTopParent(QStandardItem *item)
{
QStandardItem *p = item;
//循环向上查找父节点
while (p->parent()!=0) {
p=p->parent();
item =p;
}
if(p->index().column()!=0){
QStandardItemModel *m =static_cast<QStandardItemModel*>(ui->treeView->model());
p=m->itemFromIndex(p->index().sibling(p->index().row(),0));
}
return p;
}
QModelIndex DialogStdModel::getTopParent(QModelIndex &index)
{
QModelIndex i = index;
//如果父节点合法继续循环
while (index.parent().isValid()) {
i=index.parent();
index=i;
}
if(i.column()!=0){
i=i.sibling(i.row(),0);
}
return i;
}
最终显示效果:
