下面的代码创建一个具有两个视图的窗口:左侧为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_())

最佳答案

创建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()]

关于python - 如何正确设置QSortFilterProxyModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25879169/

10-10 12:38