0

リスト:

items = [['Pet', 'Dog'],['Pet', 'Cat'],['Bird','Eagle'],['Bird','Jay'],['Bird','Falcon']]

は によって使用され、およびmodelに割り当てられます。QTableViewQComboBox

http://i.imgur.com/Us551Nh.png

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_())
4

2 に答える 2

0

ComboBox に 2 つの一般的なカテゴリ (Pet と Bird) を表示させたいと考えています。ユーザーがカテゴリを選択すると、QTableView は選択したカテゴリに関連付けられたすべての種のリストを表示します。

これを行うために、モデルをサブクラス化する必要はありません。QComboBoxに文字列のリストを直接入力したり、 を使用しQListWidgetて動物の名前を表示したりできます。

簡単にするために、リストを辞書に変換しました。

self.items = [['Pet', 'Dog'],['Pet', 'Cat'],['Bird','Eagle'],['Bird','Jay'],['Bird','Falcon']]

になる

self.myDict={"Pet":['Dog','Cat'],"Bird":['Eagle','Jay','Falcon']}

辞書 (ペット、鳥) のキーを使用できますQComboBox。ユーザーが 1 つの種 (シグナル: QComboBox.currentIndexChanged) を選択すると、キーに関連付けられたリストが に表示されますQListWidget

完全な動作例は次のとおりです。

import sys, signal
from PyQt4 import QtCore, QtGui

class myWidget(QtGui.QWidget):
    def __init__( self, parent=None):
        super(myWidget, self ).__init__( parent )

        self.myDict={"Pet":['Dog','Cat'],"Bird":['Eagle','Jay','Falcon']}

        self.listWidget=QtGui.QListWidget()

        self.comboBox=QtGui.QComboBox()
        self.comboBox.addItems(list(self.myDict.keys()))
        #use overload signal: emits the text associated to the index 
        self.comboBox.currentIndexChanged[str].connect(self.on_change)
        #set initial index so the listWidget is not empty
        self.comboBox.setCurrentIndex(1)

        layout=QtGui.QVBoxLayout()
        layout.addWidget(self.comboBox)
        layout.addWidget(self.listWidget)
        self.setLayout(layout)

    def on_change(self,key):
        #clear everything
        self.listWidget.clear()
        #fill with list of corresponding key
        for name in self.myDict[key]:
            item=QtGui.QListWidgetItem(name)
            item.setFlags(item.flags()|QtCore.Qt.ItemIsUserCheckable)
            item.setCheckState(QtCore.Qt.Unchecked)
            self.listWidget.addItem(item)

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    win= myWidget()
    signal.signal(signal.SIGINT, signal.SIG_DFL)
    win.show() 
    sys.exit(app.exec_())
于 2015-08-14T08:07:39.897 に答える