gpt4 book ai didi

python - 如何正确设置QSortFilterProxyModel

转载 作者:行者123 更新时间:2023-12-01 05:02:03 26 4
gpt4 key购买 nike

下面的代码创建一个具有两个 View 的窗口:左侧的 QListView 和右侧的 QTreeView。两个 View 共享相同的 Model(),它是 QAbstractTableModel 的子类。我希望左侧 QListView 显示 self.modelDict 字典键。而右侧的QTreeView用来显示字典值。有人建议我使用 QSortFilterProxyModel 来完成任务。如果您展示如何在这段代码中实现QSortFilterProxyModel,我将不胜感激:

enter image description here

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)

当第一个 View 中的当前索引更改(连接到信号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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com