Qt5.12实战之QStandardItem与QStandardItemModel使用

  1. 使用前引用头文件

#include <QStandardItem>
#include <QStandardItemModel>
  1. 界面设计

  1. 创建数据项模型

  1. 创建标准数据项

  1. 在构造函数中填充数据

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;
}

最终显示效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自由软件开发者

有你的鼓励,我会更加努力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值