下面的代码会创建一个包含两个视图的窗口:左侧为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_())
,我将不胜感激:
{{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()]