im nachfolgenden, ausführbaren Quelltext arbeite ich mit der QStandardItemModel()-Klasse. Um das ganze zu simulieren, füge ich die verschachtelte Liste (self.items) zu besagten Model hinzu. Was ihr auch sehen könnte, ist, dass ich QTreeView() mittels der setView()-Methode in die QComboBox() hinzufügen möchte. Was ich nun erwarte ist, dass in der QTreeView() eine bestimmte Spalte, hier die erste Spalte, versteckt wird. Dies versuche ich auch vergeblich - vermittels der setColumnHidden()-Methode. Irgendwie will mir das nicht klappen. Derzeit sieht es so aus, dass sich die QComboBox() nicht einmal aufklappt, wenn ich anklicke.
Code: Alles auswählen
import sys
from PyQt4.QtCore import Qt, QVariant
from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
QVBoxLayout
class MyCustomDialog(QDialog):
def __init__(self, parent=None):
QDialog.__init__(self, parent)
# First we create an instance of QStandardItemModel()
self.standard_item_model = QStandardItemModel(0, 2)
# Now we create a liste and fill it.
self.items = [
["0", 'Cookie dough'],
["1", 'Hummus'],
["2", 'Spaghetti'],
["3", 'Dal makhani'],
["4", 'Chocolate whipped cream']
]
# We simulate it and populate the liste to given model.
for i in self.items:
self.populate_data_item(i)
# We want to show the data, so we create the instance of QTreeView()
self.tree_view = QTreeView()
self.tree_view.setRootIsDecorated(False)
# Later we want to set the TreeView to the Combobox, so we have to create the instance of QComboBox()
self.combo_box = QComboBox()
self.combo_box.setView(self.tree_view)
self.combo_box.setModel(self.standard_item_model)
# We don't neeed to see the first column. So hide it.
self.tree_view.setColumnHidden(0, True)
# Maybe we can also hide the header. Here, comment it out.
#self.tree_view.header().hide()
# Let us set the header with two columns
self.set_header_data(list_header_data = ["ID", "Data"])
layout = QVBoxLayout(self)
layout.addWidget(self.combo_box)
self.setLayout(layout)
self.selection_changed()
def selection_changed(self):
self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
self.get_id_tree_view(new_index=new_index, tree_view_object=self.tree_view))
def generator_header_data(self, list_header):
for header_data in list_header:
yield header_data
def set_header_data(self, list_header_data=None):
count_column = 0
for header_data in self.generator_header_data(list_header_data):
self.standard_item_model.setHeaderData(count_column, Qt.Horizontal, header_data)
count_column +=1
return
def populate_data_item(self, tuple_items):
count_items = len(tuple_items)
if count_items == 2:
item_first, item_second = tuple_items
two_columns_item = [QStandardItem(str(item_first)), QStandardItem(item_second)]
self.standard_item_model.appendRow(two_columns_item)
return
def get_id_tree_view(self, new_index=None,
tree_view_object=None,):
try:
if not new_index is None:
index = new_index.indexes()[0].data()#.toPyObject()
if isinstance(index, QVariant):
print "index", index.toString()
except IndexError as InErr:
print "InErr", InErr
def main():
app = QApplication(sys.argv)
window = MyCustomDialog()
window.resize(200, 50)
window.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()