如何正确设置QSortFilterProxyModel

时间:2014-09-16 22:05:21

标签: python qt pyqt

下面的代码会创建一个包含两个视图的窗口:左侧为QListView,右侧为QTreeView。两个视图共享Model()QAbstractTableModel分类的QListView。 我希望左self.modelDict显示QTreeView字典键。而右侧QSortFilterProxyModel则显示字典值。我被建议使用QSortFilterProxyModel来完成任务。如果您展示如何在此代码中实现import os,sys from PyQt4 import QtCore, QtGui app=QtGui.QApplication(sys.argv) elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Birds':{1:'Duck',2:'Hawk',3:'Pigeon'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}} class Model(QtCore.QAbstractTableModel): def __init__(self): QtCore.QAbstractTableModel.__init__(self) self.modelDict={} self.items=[] def rowCount(self, parent=QtCore.QModelIndex()): return len(self.items) def columnCount(self, index=QtCore.QModelIndex()): return 3 def data(self, index, role): if not index.isValid() or not (0<=index.row()<len(self.items)): return QtCore.QVariant() if role==QtCore.Qt.DisplayRole: return self.items[index.row()] def addItem(self, itemName=None, column=0): totalItems=self.rowCount() self.beginInsertRows(QtCore.QModelIndex(), totalItems+1, column) if not itemName: itemName='Item %s'%self.rowCount() self.items.append(itemName) self.endInsertRows() def buildItems(self): (self.addItem(key) for key in self.modelDict) class Window(QtGui.QWidget): def __init__(self): super(Window, self).__init__() mainLayout=QtGui.QHBoxLayout() self.setLayout(mainLayout) self.model=Model() self.model.modelDict=elements self.model.buildItems() self.viewA=QtGui.QListView() self.viewA.setModel(self.model) self.viewB=QtGui.QTableView() self.viewB.setModel(self.model) mainLayout.addWidget(self.viewA) mainLayout.addWidget(self.viewB) self.show() window=Window() sys.exit(app.exec_()) ,我将不胜感激:

enter image description here

{{1}}

1 个答案:

答案 0 :(得分:2)

创建QSortFilterProxyModel

self.proxy = QSortFilterProxyModel()

将基本模型分配给代理:

self.proxy.setSourceModel(self.model)

使代理过滤器使用模型的第一列:

self.proxy.setFilterKeyColumn(0)

将代理分配给表而不是模型:

self.viewB.setModel(self.proxy)

当第一个视图中的当前索引发生更改(连接到信号activated)时,请更改过滤器密钥:

self.proxy.setFilterRegExp(self.model.data(self.viewA.currentIndex()).toString())

viewB将显示按viewA

中所选项目的值过滤的数据

另外

  • 您在模型中错误地实现了方法data。它永远不会返回值,只返回键。
  • self.items也只包含密钥。

根据您希望如何显示值 - 在3行1列或3列1行中 - 这些应该是固定的。

例如,如果您想在1行3列中显示值,则需要在data方法中使用此类字符:

 if role==QtCore.Qt.DisplayRole: return self.items[index.row()][index.column()]