清单:
items = [['Pet', 'Dog'],['Pet', 'Cat'],['Bird','Eagle'],['Bird','Jay'],['Bird','Falcon']]
由分配给model
和QTableView
的{{1}}使用。
我希望QComboBox
只显示“宠物”和“鸟”
而Combobox
显示:“狗”,“鹰”和“杰伊”。
怎么做到这一点?
QTableView
答案 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_())