pyqt在QTreeView中获得选中数据项(单击数据项)的信息

来源:互联网 发布:武汉网络调查公司 编辑:程序博客网 时间:2024/05/16 17:22

首先,要讲一下QT中item、model、view的关系。item是一条数据项,类似表格中的一行,model是数据模型,类似一张表,view则是将这个model这张表显示出来的外在表现。以demo中的simpletreemodel为例,在这个程序中,用了TreeItem、TreeModel两个自定义类,并且TreeModel继承了QAbstractItemModel抽象类。在构造TreeModel时,TreeItem的对象作为结点,被依次加入model的树中,在TreeModel类中比较重要的参数一个是index,另一个是role,在parent、data等接口函数中均有使用。其中index是QModelIndex类型,可以用来表示结点的位置信息,比如第几行、第几列,还可以通过internalPointer()函数,获得该结点上载入的TreeItem对象的指针,从而获得结点上的文字等信息。role则是用来表示结点的用途,比如是否是checkbox、还是图标,等等。

在simpletreemodel这个例子中,TreeModel先将TreeItem的对象逐个加入到自己的tree中,然后TreeModel再在作为一个QTreeView对象的model被加载。在这个demo中,我发现:当单击一个数据项时,程序无法捕获这个操作,也不能知道到底哪个Item被选中了。于是google、百度了一番,发现了一个解决方案,先发到这里,供大家参考:

1.首先自己实现一个QTreeView的子类TreeView:

其中,将click信号与槽函数getCurrentIndex绑定,其传递参数为数据项index。

在getCurrentIndex函数中,通过index.internalPointer()函数,又获得了TreeItem对象的指针,就可以访问TreeItem中的成员变量了。如果需要响应双击事件,则将clicked(QModelIndex)换为doubleClicked(QModelIndex)即可

2.再到__main__中,将原来的代码改为:

也就是采用新的TreeView类来显示model,运行之后,就能看到效果了,这时单击数据项,就会弹出窗口。