如何向qtreeview 自定义model 添加新行

如何向qtreeview 自定义model 添加新行,第1张

一. 树形结构体定义 treeitem.h

Cpp代码

/**

* @brief 通用树形结构类

*/

class TreeItem

{

public:

TreeItem(const QList<QVariant>&data,TreeItem *parent=0 )

~TreeItem()

void appendChild(TreeItem *child)

TreeItem *child(int row)

int childCount() const

int columnCount() const

QVariant data(int column) const

int row() const

TreeItem *parent()

private:

TreeItem *parentItem // 父结点

QList<TreeItem*>childItems// 子结点列表

QList<QVariant>itemData// 子节点对应数据

}

二. 树形model实现

Cpp代码

#include <QAbstractItemModel>

#include "TreeItem.h"

class TagTreeModel : public QAbstractItemModel

{

Q_OBJECT

public:

TagTreeModel(QObject *parent = 0)

~TagTreeModel()

QVariant data(const QModelIndex &index, int role) const

Qt::ItemFlags flags(const QModelIndex &index) const

QVariant headerData(int section, Qt::Orientation orientation,

int role = Qt::DisplayRole) const

QModelIndex index(int row, int column,

const QModelIndex &parent = QModelIndex()) const

QModelIndex parent(const QModelIndex &index) const

int rowCount(const QModelIndex &parent = QModelIndex()) const

int columnCount(const QModelIndex &parent = QModelIndex()) const

// 构建模型数据

void setupModelData(TreeItem *parent)

// 更新模型数据

void updateData()

private:

TreeItem *rootItem// 最顶层顶根节点(一个无效的QModelIndex)

}

TagTreeModel.cpp

Cpp代码

#include "TagTreeModel.h"

#include <QtGui>

TagTreeModel::TagTreeModel(QObject *parent):QAbstractItemModel(parent)

{

rootItem=NULL

updateData()

}

TagTreeModel::~TagTreeModel()

{

delete rootItem

}

void TagTreeModel::updateData()

{

// 废弃旧的模型数据

if(rootItem)

{

delete rootItem

rootItem=NULL

}

QList<QVariant>rootData

rootData<<"Tag"<<"Type"

rootItem=new TreeItem(rootData)

setupModelData(rootItem)

// 刷新模型

reset()

}

QVariant TagTreeModel::data(const QModelIndex &index, int role) const

{

if (!index.isValid())

return QVariant()

// 添加图标

if(role==Qt::DecorationRole&&index.column()==0)

return QIcon("images/fold.png")

// 显示节点数据值

if(role==Qt::DisplayRole)

{

TreeItem *item=static_cast<TreeItem*>(index.internalPointer())

return item->data(index.column())

}

return QVariant()

}

Qt::ItemFlags TagTreeModel::flags(const QModelIndex &index) const

{

if(!index.isValid())

return 0

return Qt::ItemIsEnabled|Qt::ItemIsSelectable

}

QVariant TagTreeModel::headerData(int section, Qt::Orientation orientation,int role) const

{

if(orientation==Qt::Horizontal&&role==Qt::DisplayRole)

return rootItem->data(section)

return QVariant()

}

QModelIndex TagTreeModel::index(int row, int column,const QModelIndex &parent) const

{

if(!hasIndex(row,column,parent))

return QModelIndex()

TreeItem *parentItem

if(!parent.isValid())

{

parentItem=rootItem

}else

{

parentItem=static_cast<TreeItem*>(parent.internalPointer())

}

TreeItem *childItem=parentItem->child(row)

if(childItem)

return createIndex(row,column,childItem)// 展开树形,为子节点建立索引

else

return QModelIndex()

}

QModelIndex TagTreeModel::parent(const QModelIndex &index) const

{

if(!index.isValid())

return QModelIndex()

TreeItem *childItem=static_cast<TreeItem*>(index.internalPointer())

TreeItem *parentItem=childItem->parent()

// 顶层节点,直接返回空索引

if(parentItem==rootItem)

return QModelIndex()

// 为父结点建立索引

return createIndex(parentItem->row(),0,parentItem)

}

int TagTreeModel::rowCount(const QModelIndex &parent) const

{

TreeItem *parentItem

if(!parent.isValid())

parentItem=rootItem

else

parentItem=static_cast<TreeItem*>(parent.internalPointer())

return parentItem->childCount()// 返回父结点下子结点数目

}

int TagTreeModel::columnCount(const QModelIndex &parent ) const

{

return rootItem->columnCount()

}

// 设置模型数据,构建包含10个根结点,每个根结点包含两个子节点的树形结构

void TagTreeModel::setupModelData(TreeItem *parent)

{

for(int i=0i<10i++)

{

QList<QVariant>datas

datas<<QString("设备-%1").arg(i+1)<<QString("类型-%1").arg(i+1)

// 主结点下挂两个子节点

TreeItem *primary=new TreeItem(datas,parent)

parent->appendChild(primary)

for(int j=0j<2j++)

{

QList<QVariant>ds

ds<<QString("子设备-%1").arg(j+1)<<QString("子类型-%1").arg(j+1)

primary->appendChild(new TreeItem(ds,primary))

}

}

}

#include"QDebug"

#include"QTreeView"

#include"QStandardItemModel"

#include"QPushButton"

#include"QItemSelectionModel"

#include"QModelIndex"

#include"QStandardItem"

    this->resize(1000,1000)

    //创建树

    QTreeView *treeView=new QTreeView(this)

    treeView->resize(800,800)

    treeView->move(100,100)

    QStandardItemModel *model=new QStandardItemModel(treeView)

    treeView->setModel(model)

    //model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("项目名")<<QStringLiteral("相关信息1")<<QStringLiteral("相关信息2"))

    //model->setVerticalHeaderLabels(QStringList()<<QStringLiteral("项目名")<<QStringLiteral("相关信息1")<<QStringLiteral("相关信息2"))

    QStandardItem * item = new QStandardItem(tr("item one"))//创建一个条目对象

    model->appendRow(item)

    //去掉表头

    treeView->setHeaderHidden(true)

//利用QList<QStandardItem*>添加节点

    QList itemList1

    QList itemList2

    QStandardItem * item1 = new QStandardItem(tr("item one"))//创建一个条目对象

    itemList1.append(item1)

    QStandardItem * item2 = new QStandardItem(tr("item two"))//创建一个条目对象

    itemList1.append(item2)

    QStandardItem * item3 = new QStandardItem(tr("item three"))//创建一个条目对象

  //  item.push_back(item3)

    QStandardItem * item4 = new QStandardItem(tr("item four"))//创建一个条目对象

  // item.push_back(item4)

    QStandardItem * item5 = new QStandardItem(tr("item five"))//创建一个条目对象

    QStandardItem * item6 = new QStandardItem(tr("item five"))//创建一个条目对象

    itemList2<

    model->appendRow(item3)

    model->appendRow(item4)

    //model->setItem(1,new QStandardItem("123"))

    item3->appendRows(itemList1)

    item2->appendRows(itemList2)

    //item->setChild(0,new QStandardItem("456"))

    //添加子节点

    QPushButton *buttonAdd=new QPushButton(treeView)

    buttonAdd->move(300,700)

    buttonAdd->setText("添加")

    QItemSelectionModel *currentModel=new QItemSelectionModel()

    connect(buttonAdd,&QPushButton::clicked,this,[=](){ 

        QStandardItem *currentModel=model->itemFromIndex(treeView->currentIndex())

        if(model->rowCount()>0)

      {

            currentModel->appendRow(new QStandardItem("333"))

      }

    })

    //删除子节点

    QPushButton *buttonDel=new QPushButton(treeView)

    buttonDel->move(500,700)

    buttonDel->setText("删除")

    connect(buttonDel,&QPushButton::clicked,this,[=](){

        QStandardItem *currentModel=model->itemFromIndex(treeView->currentIndex())

        qDebug()<<"treeView->currentIndex().row()"<currentIndex().row()

        if(model->rowCount()>0)

      {

            if(currentModel->parent())

            {

                currentModel->parent()->removeRow(treeView->currentIndex().row())

            }

            else

            {

                model->removeRow(treeView->currentIndex().row())

                qDebug()<rowCount()

            }

      }

    })

//打开根节点

    treeView->expand(model->indexFromItem(model->item(0)))

BIAS0:= (C-MA(C,2))/MA(C,2)*100

BIAS1 := (C-MA(C,12))/MA(C,12)*100

BIAS2 := (C-MA(C,26))/MA(C,26)*100

BIAS3 := (C-MA(C,48))/MA(C,48)*100

HXL:=V/CAPITAL*100

D1:=INDEXC

D2:=MA(D1,56)

DR2:=D1/D2<0.94

E1:=(C-HHV(C,12))/HHV(C,12)*10

E2:=(C-REF(C,26))/REF(C,26)*10


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11416422.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存