PyQt QTreeView:试图连接到selectionChanged信号
问题描述:
我想用PyQt连接到QTreeView的selectionChanged信号。我过去做过这个(对于QTableView)并且成功了。但是现在我无法得到类似的代码来工作。PyQt QTreeView:试图连接到selectionChanged信号
在下面的代码示例中,我成功地连接了展开和折叠的信号,但未连接到selectionChanged或激活的信号。有人能告诉我我做错了什么吗?谢谢。
from PyQt4 import QtGui
from PyQt4 import QtCore
################################################################################
class ShaderDefTreeView(QtGui.QTreeView):
"""
Overrides the QTreeView to handle keypress events.
"""
#---------------------------------------------------------------------------
def __init__(self, parent=None):
"""
Constructor for the ShaderDefTreeView class.
"""
super(ShaderDefTreeView, self).__init__(parent)
#listen to the selectionChanged signal
print "Connecting"
#whenever the selection changes, let the data model know
self.connect(self,
QtCore.SIGNAL("selectionChanged(QItemSelection&, QItemSelection&)"),
self.store_current_selection)
self.connect(self, QtCore.SIGNAL("activated(const QModelIndex &)"),
self.activated)
self.connect(self, QtCore.SIGNAL("collapsed(const QModelIndex &)"),
self.collapsed)
self.connect(self, QtCore.SIGNAL("expanded(const QModelIndex &)"),
self.expanded)
#---------------------------------------------------------------------------
def store_current_selection(self, newSelection, oldSelection):
print "changed"
#self.model().selection_changed(newSelection)
#---------------------------------------------------------------------------
def expanded(self, newSelection):
print "expanded"
#---------------------------------------------------------------------------
def collapsed(self, newSelection):
print "collapsed"
#---------------------------------------------------------------------------
def activated(self, newSelection):
print "activated"
答
好的,计算出来(主要是意外)。
因为我在init中进行连接,但稍后只设置此QTreeView的模型,所以没有合适的selectionModel。
为了使工作我不得不做出两处修改:
1)的发光物体,就必须改变是QTreeView则的selectionModel设置。我不知道为什么,但在网络上的一些(罕见)的例子表明,这可能是这种情况
和
2)我不得不重写QTreeView则这样的方法,则setModel它调用父'setModel方法,然后进行连接。
因此,新的代码如下所示:
class ShaderDefTreeView(QtGui.QTreeView):
"""
Overrides the QTreeView to handle keypress events.
"""
#---------------------------------------------------------------------------
def __init__(self, parent=None):
"""
Constructor for the ShaderDefTreeView class.
"""
super(ShaderDefTreeView, self).__init__(parent)
#---------------------------------------------------------------------------
def setModel(self, model):
super(ShaderDefTreeView, self).setModel(model)
self.connect(self.selectionModel(),
QtCore.SIGNAL("selectionChanged(QItemSelection, QItemSelection)"),
self.store_current_selection)
#---------------------------------------------------------------------------
def store_current_selection(self, newSelection, oldSelection):
print "changed"
答
如果您使用的声明,你可以这样做:
self.ui = uic.loadUi(main_path, self)
self.ui.tree.selectionModel().selectionChanged.connect(self.item_selection_changed_slot)