如何与QTableView和QComboBox共享相同的模型

时间:2015-08-13 18:53:39

标签: python model-view-controller pyqt qabstracttablemodel qsortfilterproxymodel

清单:

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

由分配给modelQTableView的{​​{1}}使用。

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

我希望QComboBox只显示“宠物”和“鸟” 而Combobox显示:“狗”,“鹰”和“杰伊”。 怎么做到这一点?

QTableView

1 个答案:

答案 0 :(得分:0)

  

我希望ComboBox显示两个通用类别(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']}

字典(Pet,Bird)的键可用于QComboBox。当用户选择一个物种(信号: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_())