1

在 QTableView中进行任意多选的最有效和技术上(Python/PyQt4 )正确的方法是什么,该QTableView的模型包含QStandardItems(图表数据)的层次结构,isSelected每个项目都添加了自定义数据属性。

详细说明:与表格一起,我有一个 matplotlib 图,它输出isSelected与我的数据相对应的范围(属性直接来自这些范围),QTableView我想在这两个 gui 元素之间添加一些交互。

即 matplotlib 绘图选择反映在QTableView,反之亦然(我通过将选择更改挂钩到读取相应的索引并将它们反馈回图表来获得)。

希望这个解释是有道理的。谢谢。

4

1 回答 1

1

正如你所说,现在你有你的 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)
于 2012-05-03T21:15:22.950 回答