リスト:
items = [['Pet', 'Dog'],['Pet', 'Cat'],['Bird','Eagle'],['Bird','Jay'],['Bird','Falcon']]
は によって使用され、およびmodel
に割り当てられます。QTableView
QComboBox
Combobox
「ペット」と「鳥」のみQTableView
を表示し、「犬」、「イーグル」、「ジェイ」を表示したい。これを達成する方法は?
from PySide import QtGui, QtCore
class Model(QAbstractTableModel):
def __init__(self, parent=None, *args):
QAbstractTableModel.__init__(self, parent, *args)
self.items = [['Pet', 'Dog'],['Pet', 'Cat'],['Bird','Eagle'],['Bird','Jay'],['Bird','Falcon']]
def rowCount(self, parent=QModelIndex()):
return len(self.items)
def columnCount(self, parent=QModelIndex()):
return 2
def data(self, index, role):
if not index.isValid(): return
row=index.row()
column=index.column()
return self.items[row][column]
class Proxy(QSortFilterProxyModel):
def __init__(self):
super(Proxy, self).__init__()
def filterAcceptsRow(self, rowProc, parentProc):
modelIndex=self.sourceModel().index(rowProc, 0, parentProc)
item=self.sourceModel().data(modelIndex, Qt.DisplayRole)
return True
class MyWindow(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
vLayout=QVBoxLayout(self)
self.setLayout(vLayout)
model=Model(self)
proxy=Proxy()
proxy.setSourceModel(model)
self.combo=QtGui.QComboBox()
self.combo.activated.connect(self.comboActivated)
vLayout.addWidget(self.combo)
self.combo.setModel(proxy)
self.ViewA=QTableView(self)
self.ViewA.setModel(model)
self.ViewA.clicked.connect(self.viewClicked)
vLayout.addWidget(self.ViewA)
def viewClicked(self, indexClicked):
print 'indexClicked() row: %s column: %s'%(indexClicked.row(), indexClicked.column() )
proxy=indexClicked.model()
def comboActivated(self, arg):
print 'comboClicked() arg:', arg
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MyWindow()
w.show()
sys.exit(app.exec_())