Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 项目在视图中显示时会重复_Python_Qt_Pyqt - Fatal编程技术网

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]中的数字不需要这一行:请发布工作代码示例来说明您的答案。谢谢。