gpt4 book ai didi

python - 在 View 中显示时,项目会重复

转载 作者:太空宇宙 更新时间:2023-11-03 18:10:33 26 4
gpt4 key购买 nike

下面的代码创建一个具有两个 View 的对话框窗口:QListView 在左侧,QTableView 在右侧。两个 View 共享相同的 DataModel 实例。左 View 显示了该动物的相同名称 3 次。如何调整代码以使左 View 不列出重复的动物。

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 ListModel(QtCore.QAbstractTableModel):
def __init__(self):
QtCore.QAbstractTableModel.__init__(self)
self.items=[]
def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.items)

def columnCount(self, index=QtCore.QModelIndex()):
return 4

def data(self, index, role):
if not index.isValid() or not (0<=index.row()<len(self.items)): return QtCore.QVariant()
key=str(self.items[index.row()])
column=index.column()

if role==QtCore.Qt.DisplayRole:
if not column: return key
else: return elements.get(key,{}).get(column)

def buildItems(self):
for species in elements:
for number in elements[species]:
number=self.rowCount()
self.beginInsertRows(QtCore.QModelIndex(), number+1, 0)
self.items.append(species)
self.endInsertRows()


class TableModel(QtGui.QSortFilterProxyModel):
def __init__(self, parent=None):
super(TableModel, self).__init__(parent)

def headerData(self, column, orientation, role=QtCore.Qt.DisplayRole):
if role==QtCore.Qt.TextAlignmentRole:
if orientation==QtCore.Qt.Horizontal:
return QtCore.QVariant(int(QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter))
return QtCore.QVariant(int(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter))
if role!=QtCore.Qt.DisplayRole:
return QtCore.QVariant()

if orientation==QtCore.Qt.Horizontal:
return QtCore.QVariant("Species %s"%column)

return QtCore.QVariant(int(column+1))

class Window(QtGui.QWidget):
def __init__(self):
super(Window, self).__init__()
mainLayout=QtGui.QHBoxLayout()
self.setLayout(mainLayout)

self.listModel=ListModel()
self.listModel.buildItems()

self.tableModel=TableModel()
self.tableModel.setFilterKeyColumn(0)
self.tableModel.setSourceModel(self.listModel)

self.viewA=QtGui.QListView()
self.viewA.setModel(self.listModel)
self.viewA.clicked.connect(self.onClick)

self.viewB=QtGui.QTableView()
self.viewB.setModel(self.tableModel)

mainLayout.addWidget(self.viewA)
mainLayout.addWidget(self.viewB)
self.show()

def onClick(self):
index=self.viewA.currentIndex()
key=self.listModel.data(index, QtCore.Qt.DisplayRole)
value=self.listModel.data(index, QtCore.Qt.ItemDataRole)
self.tableModel.setFilterRegExp('%s'%key)

window=Window()
sys.exit(app.exec_())

最佳答案

您很可能不想添加每个物种数量次。因此删除这一行:

for number in elements[species]:

您还可以在下一行重新设置该变量的值。

关于python - 在 View 中显示时,项目会重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26050831/

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