2014-09-16 5 views
1

Код ниже создает окно с двумя видами: QListView слева и QTreeView справа. Оба представления имеют одинаковые Model(), которые относятся к классу от QAbstractTableModel. Я хочу оставить QListView для отображения ключей словаря self.modelDict. Пока правая сторона QTreeView отображает значения словаря. Мне было рекомендовано использовать QSortFilterProxyModel, чтобы все было сделано. Я был бы признателен, если вы покажете, как реализовать 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_()) 
+0

Когда 'animals' выбрана в таблице слева, то, что делать вы ожидаете увидеть в правом столе? Что должно отображаться в столбцах 1, столбце2 и столбце3? – Ezee

ответ

2

Создание QSortFilterProxyModel:

self.proxy = QSortFilterProxyModel() 

Назначение базовой модели к прокси-серверу:

self.proxy.setSourceModel(self.model) 

Использовать фильтр прокси-сервера е первый столбец модели:

self.proxy.setFilterKeyColumn(0) 

Назначить прокси к столу вместо модели:

self.viewB.setModel(self.proxy) 

Когда текущий индекс в первом зрения изменяется (соединение с сигналом 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()] 
Смежные вопросы