QTreeView多层数据平面索引及数据获取

1,148 阅读1分钟

在网上找了好久如何获取QTreeview的当前行数据方法,贴上感觉都答不到点子上...折腾半天才搞出来,最后还是去查了官方文档 ○| ̄|_。。。

**1. 这里先给下我的QTreeview数据结构,是动态生成的多层数据 **

image.png

网上给出的大多数方法,都是监听QTreeview的press或doubleclick 信号

connect(treeView,SIGNAL(pressed(QModelIndex)),this,SLOT(slot_treeView_pressed(QModelIndex)));

然后通过自定义槽信号进行处理

void POSCollect::OnlineTreeViewDoubleClick(const QModelIndex & index)
{

QAbstractItemModel* m=(QAbstractItemModel*)index.model();
for(int columnIndex = 0; columnIndex < m->columnCount(); columnIndex++)
{
	QModelIndex x=m->index(index.row(),columnIndex);

	QString s= x.data().toString();
	QMessageBox::about(this,s,s);
}
}

然而这种情况下,点击子元素,返回的仍然是父元素的信息,比如点击下图位置,返回的是“test”“Group”“F04..”

image.png

2. 正解!

查阅官方文档, QTreeView的信号列表,发现selectionChanged这个,然后试了一下 ,发现阔以!

image.png

以下摘自帖子blog.csdn.net/dpsying/art…

QTreeView的选中内容由一个封装的QItemSelectionModel管理,通过QTreeView接口selectionModel()可以取得该Model指针。

该Model存在这些信号:

image.png

一般如果设置选中模式为单个元素,那么使用currentChanged信号即可;

如果是单行,那么使用currentRowChanged信号即可;

如果是多选,一般使用selectionChanged信号。

其他不常用,使用方法类似,根据情况选用。

绑定信号:

QItemSelectionModel *selectionModel= tree->selectionModel();

connect(selectionModel, SIGNAL(selectionChanged (const QItemSelection &, const QItemSelection &)),this, SLOT(selectionChangedSlot(const QItemSelection &, const QItemSelection &)));

槽函数实现:

selectionChangedSlot(const QItemSelection &selected,const QItemSelection &deselected){

        QItemSelectionModel *selections = tree->selectionModel();

        QModelIndexList indexes = selections->selectedIndexes();

        foreach(QModelIndex index,indexes){

            QStandardItem * item = _pModel->itemFromIndex(index);

            if(item){

                QString lnName =item->text();

                qDebug() << lnName;

            }
        }
}

这样就可以获取当前点击的不管的父元素还是子元素的正行数据啦 O(∩_∩)O