
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)*100BIAS1 := (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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)