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

