Python 项目在视图中显示时会重复
下面的代码创建了一个包含两个视图的对话框窗口:Python 项目在视图中显示时会重复,python,qt,pyqt,Python,Qt,Pyqt,下面的代码创建了一个包含两个视图的对话框窗口:QListView位于左侧,而QTableView位于右侧。两个视图共享相同的DataModel实例。左视图三次显示动物的相同名称。如何调整代码,使左视图不列出重复的动物 import os,sys from PyQt4 import QtCore, QtGui app=QtGui.QApplication(sys.argv) elements={'Animals':{1:'Bison',2:'Panther',3:'Elephant'},'Bir
QListView
位于左侧,而QTableView
位于右侧。两个视图共享相同的DataModel
实例。左视图三次显示动物的相同名称。如何调整代码,使左视图不列出重复的动物
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_())
导入操作系统,系统
从PyQt4导入QtCore、QtGui
app=QtGui.QApplication(sys.argv)
元素={'Animals':{1:'Bison',2:'Panther',3:'Elephant',Birds':{1:'Duck',2:'Hawk',3:'鸽子'},'Fish':{1:'Shark',2:'Salmon',3:'Piranha'}
类ListModel(QtCore.QAbstractTableModel):
定义初始化(自):
QtCore.QAbstractTableModel.\uuuu init\uuuu(self)
self.items=[]
def行数(self,parent=QtCore.QModelIndex()):
返回len(自我项目)
def columnCount(self,index=QtCore.QModelIndex()):
返回4
def数据(自身、索引、角色):
如果index.isValid()与否(0插入项时,错误出现在
buildItems
函数的for
循环中,请尝试检查此项。很可能您不想添加每种物种的次数。因此删除此行:
for number in elements[species]:
您还可以在下一行重新分配该变量的值。我认为问题出在这一行,元素[species]中的数字不需要这一行:请发布工作代码示例来说明您的答案。谢谢。