基于QStandardItem数据属性的QTableView项目选择

时间:2012-05-03 10:53:56

标签: python pyqt selection qtableview qstandarditemmodel

QTableView 中进行任意多重选择的最有效和最技术( Python / PyQt4 )的正确方法是什么?该模型的层次结构为{{ 1}}(图表绘图数据),每个项目添加了自定义QStandardItems数据属性。

详细信息:除了表格,我还有一个matplotlib图,它输出范围(isSelected属性直接来自这些范围),对应于我的isSelected数据,我想添加一些交互这两个gui元素之间。

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

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

1 个答案:

答案 0 :(得分:1)

正如你所说,现在你有了你的QTableView.selectionChanged()将选择反馈给你的matplot。最有效的方法是让你的matplot为相关项目发出选择信号。

表视图已经将其选择存储在QItemSelectionModel中,因此,就我所见,它将是多余的,并且不必在项目上存储您自己的isSelected属性。您的matplot视图应该知道它正在使用的项目,并且应该能够通知表格视图其选择更改。

您的matplot视图可以显示您发出的信号,例如selectionChanged(items),并且可以继续不了解表格视图。

您的表视图,因为它已经知道matplot视图,可以连接到其selectionChanged(items)到matplot并监听选择更改。即使您的表也发出信号并且不知道matplot,您也可以在任何父类知道它们的情况下建立连接。

这就是我认为不需要该属性的原因:使用该属性的唯一方法是扫描整个模型,检查每个项目。那不是很有效率。选择应该发生在对发出信号的反应中。

myMatPlotView.selectionchanged.connect(myTableView.matplotSelected)

matPlotSelected()广告位中,您可以使用选择模型来设置项目选择:

<强>的tableView

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)