在网上找了好久如何获取QTreeview的当前行数据方法,贴上感觉都答不到点子上...折腾半天才搞出来,最后还是去查了官方文档 ○| ̄|_。。。
**1. 这里先给下我的QTreeview数据结构,是动态生成的多层数据 **
网上给出的大多数方法,都是监听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..”
2. 正解!
查阅官方文档, QTreeView的信号列表,发现selectionChanged这个,然后试了一下 ,发现阔以!
以下摘自帖子blog.csdn.net/dpsying/art…
QTreeView的选中内容由一个封装的QItemSelectionModel管理,通过QTreeView接口selectionModel()可以取得该Model指针。
该Model存在这些信号:
一般如果设置选中模式为单个元素,那么使用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