2014-09-26 51 views
1

下面的代码创建一个对话框窗口,其中包含两个视图:左侧为QListView,右侧为QTableView。两个视图共享相同的DataModel实例。左视图显示动物的同一名称三次。如何调整代码,以便左侧视图不会列出重复的动物。在视图中显示时重复的项目

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_()) 
+0

我认为这个问题是在这个行中不需要的元素[物种]数量: – Ezee 2014-09-26 06:42:01

回答

1

很可能你不想每加入一次speciesnumber次。所以删除这一行:

for number in elements[species]: 

你也在下一行重视这个变量的值。

+0

请发布工作代码示例来说明您的答案。谢谢。 – alphanumeric 2014-09-26 15:35:01

0

的错误是在你的buildItems功能的for循环,当你插入的项目,尝试进行检查。