目錄:
Qt樹形控件QTreeView使用1——節點的操作
QTreeView 和 QStandardItemModel的使用
1. QStandardItemModel在QTreeView中的使用
1.1 表頭添加
model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("項目名")<<QStringLiteral("信息"));
1.2 給樹形視圖添加條目
QStandardItem* itemProject = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_Project")],QStringLiteral("項目"));
model->appendRow(itemProject);
//以下作用同appendRow
//model->setItem(0,0,itemProject);
//model->setItem(0,itemProject);
代碼中m_publicIconMap是定義好的圖標其在之前進行初始化,初始化代碼如下:
m_publicIconMap[QStringLiteral("treeItem_Project")] =QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/Project.png"));
m_publicIconMap[QStringLiteral("treeItem_folder")] =QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/folder.png"));
m_publicIconMap[QStringLiteral("treeItem_folder-ansys")] =QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/folder-ansys.png"));
m_publicIconMap[QStringLiteral("treeItem_group")] =QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/group.png"));
m_publicIconMap[QStringLiteral("treeItem_channel")] =QIcon(QStringLiteral(":/treeItemIcon/res_treeItemIcon/channel.png"));
圖標:
QStandardItem* itemChild = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夾1"));
itemProject->appendRow(itemChild);
//setChild效果同上
//itemProject->setChild(0,itemChild);
上面代碼執行後給itemProject條目添加了一個行,這一行屬於他的子條目,上代碼運行效果如下圖:
QStandardItem* itemProject = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_Project")],QStringLiteral("項目"));
model->appendRow(itemProject);
model->setItem(0/*model->indexFromItem(itemProject).row()*/,1,new QStandardItem(QStringLiteral("項目信息說明")));
QStandardItem* itemChild = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夾1"));
itemProject->appendRow(itemChild);
itemProject->setChild(0/*itemChild->index().row()*/,1,new QStandardItem(QStringLiteral("信息說明")));
QStandardItemModel* model = new QStandardItemModel(ui->treeView_Pro);
model->setHorizontalHeaderLabels(QStringList()<<QStringLiteral("項目名")<<QStringLiteral("信息"));
QStandardItem* itemProject = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_Project")],QStringLiteral("項目"));
model->appendRow(itemProject);
model->setItem(model->indexFromItem(itemProject).row(),1,new QStandardItem(QStringLiteral("項目信息說明")));
QStandardItem* itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夾1"));
itemProject->appendRow(itemFolder);
itemProject->setChild(itemFolder->index().row(),1,new QStandardItem(QStringLiteral("信息說明")));
itemFolder = new QStandardItem(m_publicIconMap[QStringLiteral("treeItem_folder")],QStringLiteral("文件夾2"));
itemProject->appendRow(itemFolder);
for(int i=0;i<5;++i){
QStandardItem* itemgroup = newQStandardItem(m_publicIconMap[QStringLiteral("treeItem_group")],QStringLiteral("組%1").arg(i+1));
itemFolder->appendRow(itemgroup);
for(int j=0;j<(i+1);++j){
QStandardItem* itemchannel = newQStandardItem(m_publicIconMap[QStringLiteral("treeItem_channel")],QStringLiteral("頻道%1").arg(j+1));
itemgroup->appendRow(itemchannel);
itemgroup->setChild(itemchannel->index().row(),1,new QStandardItem(QStringLiteral("頻道%1信息說明").arg(j+1)));
}
}
itemProject->setChild(itemFolder->index().row(),1,new QStandardItem(QStringLiteral("文件夾2信息說明")));
ui->treeView_Pro->setModel(model);
1.3 條目的其他操作
1.3.1 獲取當前選中的條目
void Widget::on_treeView_clicked(const QModelIndex &index)
{
QString str;
str += QStringLiteral("當前選中:%1\nrow:%2,column:%3\n").arg(index.data().toString())
.arg(index.row()).arg(index.column());
str += QStringLiteral("父級:%1\n").arg(index.parent().data().toString());
ui->label_realTime->setText(str);
}
on_treeView_clicked(const QModelIndex &index)是樹形控件項目點擊的槽響應函數
1.3.2 兄弟節點獲取
void Widget::on_treeView_clicked(const QModelIndex &index)
{
QString str;
str += QStringLiteral("當前選中:%1\nrow:%2,column:%3\n").arg(index.data().toString())
.arg(index.row()).arg(index.column());
str += QStringLiteral("父級:%1\n").arg(index.parent().data().toString());
QString name,info;
if(index.column() == 0)
{
name = index.data().toString();
info = index.sibling(index.row(),1).data().toString();
}
else
{
name = index.sibling(index.row(),0).data().toString();
info = index.data().toString();
}
str += QStringLiteral("名稱:%1\n信息:%2").arg(name).arg(info);
ui->label_realTime->setText(str);
}
1.3.3 尋找可見頂層
QStandardItem* getTopParent(QStandardItem* item)
{
QStandardItem* secondItem = item;
while(item->parent()!= 0)
{
secondItem = item->parent();
item = secondItem;
}
if(secondItem->index().column() != 0)
{
QStandardItemModel* model = static_cast<QStandardItemModel*>(ui->treeView->model());
secondItem = model->itemFromIndex(secondItem->index().sibling(secondItem->index().row(),0));
}
return secondItem;
}
QModelIndex getTopParent(QModelIndex itemIndex)
{
QModelIndex secondItem = itemIndex;
while(itemIndex.parent().isValid())
{
secondItem = itemIndex.parent();
itemIndex = secondItem;
}
if(secondItem.column() != 0)
{
secondItem = secondItem.sibling(secondItem.row(),0);
}
return secondItem;
}