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