0
点赞
收藏
分享

微信扫一扫

Qt5.12实战之QStandardItem与QStandardItemModel使用


  1. 使用前引用头文件

#include <QStandardItem>
#include <QStandardItemModel>

  1. 界面设计


Qt5.12实战之QStandardItem与QStandardItemModel使用_Powered by 金山文档


  1. 创建数据项模型


Qt5.12实战之QStandardItem与QStandardItemModel使用_数据_02


  1. 创建标准数据项


Qt5.12实战之QStandardItem与QStandardItemModel使用_数据项_03


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

最终显示效果:



Qt5.12实战之QStandardItem与QStandardItemModel使用_数据项_04


举报

相关推荐

0 条评论