首先,要讲一下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:
from PyQt4.Qt import * class TreeView(QtGui.QTreeView): def __init__(self, parent=None): super(TreeView, self).__init__(parent) self.connect(self, SIGNAL("clicked(QModelIndex)"), self.getCurrentIndex) #将click信号与getCurrentIndex函数绑定 def getCurrentIndex(self, index): QtGui.QMessageBox.warning(None, "treeview select", str(index.internalPointer().itemData[0]))
其中,将click信号与槽函数getCurrentIndex绑定,其传递参数为数据项index。
在getCurrentIndex函数中,通过index.internalPointer()函数,又获得了TreeItem对象的指针,就可以访问TreeItem中的成员变量了。如果需要响应双击事件,则将clicked(QModelIndex)换为doubleClicked(QModelIndex)即可
2.再到__main__中,将原来的代码改为:
#view = QtGui.QTreeView() view = TreeView()
也就是采用新的TreeView类来显示model,运行之后,就能看到效果了,这时单击数据项,就会弹出窗口。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章