正如你所说,现在你有你的 QTableView.selectionChanged() 将选择反馈给你的 matplot。最有效的方法是让您的 matplot 发出信号以供其选择,并带有相关项目。
表视图已经将其选择存储在 QItemSelectionModel 中,因此据我所知,将您自己的 isSelected 属性存储在项目上是多余且不必要的。您的 matplot 视图应该知道它正在使用的项目,并且应该能够通知表视图其选择更改。
您的 matplot 视图可以有一个您发出的信号,例如selectionChanged(items)
,并且可以继续不了解表格视图。
您的表格视图,因为它已经知道 matplot 视图,可以将其连接到selectionChanged(items)
matplot 并监听选择更改。即使您的表也发出信号并且不了解 matplot,您也可以在任何父类中都知道它们的任何父类中建立连接。
这就是我认为不需要该属性的原因:使用该属性的唯一方法是扫描整个模型,检查每个项目。那不是很有效。选择应根据发出的信号进行。
myMatPlotView.selectionchanged.connect(myTableView.matplotSelected)
在您的matPlotSelected()
插槽中,您可以使用选择模型来设置项目选择:
表视图
def matPlotSelected(self, qStandardItems):
selModel = self.selectionModel()
model = self.model()
for item in qStandardItems:
idx = model.indexFromItem(item)
selModel.select(idx, selModel.Select)
更新
在评论中,您提供了一个代码片段,它确实有助于隔离您想要实现的目标。
你的例子
def __init__(self):
super(myDialog, self).__init__()
self.t = QtGui.QTreeView()
self.m = QtGui.QStandardItemModel()
self.t.setModel(self.m)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.t)
self.setLayout(layout)
self.l = [
['one', False], ['two', True],
['three', False], ['four', True],
['five', False]]
self.populate()
def populate(self):
self.m.clear()
root = self.m.invisibleRootItem()
for item in self.l:
e = QtGui.QStandardItem()
e.setText(item[0])
root.appendRow(e)
如果这是您的实际情况,那么我上面建议的内容如下:
def populate(self):
self.m.clear()
root = self.m.invisibleRootItem()
selModel = self.t.selectionModel()
for item in self.l:
e = QtGui.QStandardItem()
e.setText(item[0])
root.appendRow(e)
if item[1]:
idx = self.m.indexFromItem(e)
selModel.select(idx, selModel.Select)