QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Samstag 22. Juli 2017, 19:58

Hallo Leute,

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.

  1. import sys
  2. from PyQt4.QtCore import Qt, QVariant
  3. from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
  4.                          QVBoxLayout
  5.  
  6. class MyCustomDialog(QDialog):
  7.     def __init__(self, parent=None):
  8.         QDialog.__init__(self, parent)
  9.  
  10.         # First we create an instance of QStandardItemModel()
  11.         self.standard_item_model = QStandardItemModel(0, 2)
  12.        
  13.         # Now we create a liste and fill it.
  14.         self.items = [
  15.             ["0", 'Cookie dough'],
  16.             ["1", 'Hummus'],
  17.             ["2", 'Spaghetti'],
  18.             ["3", 'Dal makhani'],
  19.             ["4", 'Chocolate whipped cream']
  20.         ]
  21.  
  22.         # We simulate it and populate the liste to given model.
  23.         for i in self.items:
  24.             self.populate_data_item(i)
  25.  
  26.         # We want to show the data, so we create the instance of  QTreeView()          
  27.         self.tree_view = QTreeView()
  28.         self.tree_view.setRootIsDecorated(False)
  29.  
  30.         # Later we want to set the TreeView to the Combobox, so we have to create the instance of  QComboBox()  
  31.         self.combo_box = QComboBox()
  32.         self.combo_box.setView(self.tree_view)
  33.         self.combo_box.setModel(self.standard_item_model)
  34.  
  35.         # We don't neeed to see the first column. So hide it.
  36.         self.tree_view.setColumnHidden(0, True)
  37.  
  38.         # Maybe we can also hide the header. Here, comment it out.  
  39.         #self.tree_view.header().hide()
  40.  
  41.         # Let us set the header with two columns
  42.         self.set_header_data(list_header_data = ["ID", "Data"])
  43.        
  44.         layout = QVBoxLayout(self)
  45.         layout.addWidget(self.combo_box)
  46.         self.setLayout(layout)
  47.  
  48.         self.selection_changed()      
  49.  
  50.     def selection_changed(self):
  51.         self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
  52.                     self.get_id_tree_view(new_index=new_index, tree_view_object=self.tree_view))
  53.  
  54.  
  55.     def generator_header_data(self, list_header):
  56.  
  57.         for header_data in list_header:
  58.             yield header_data
  59.            
  60.     def set_header_data(self, list_header_data=None):
  61.  
  62.         count_column = 0
  63.  
  64.         for header_data in self.generator_header_data(list_header_data):
  65.             self.standard_item_model.setHeaderData(count_column, Qt.Horizontal, header_data)
  66.  
  67.             count_column +=1
  68.  
  69.         return
  70.        
  71.     def populate_data_item(self, tuple_items):
  72.        
  73.         count_items = len(tuple_items)
  74.  
  75.         if count_items == 2:
  76.  
  77.             item_first, item_second = tuple_items
  78.  
  79.         two_columns_item = [QStandardItem(str(item_first)), QStandardItem(item_second)]
  80.  
  81.         self.standard_item_model.appendRow(two_columns_item)
  82.  
  83.         return      
  84.  
  85.     def get_id_tree_view(self, new_index=None,
  86.                          tree_view_object=None,):
  87.  
  88.         try:
  89.             if not new_index is None:
  90.  
  91.                 index = new_index.indexes()[0].data()#.toPyObject()
  92.  
  93.                 if isinstance(index, QVariant):
  94.                     print "index", index.toString()
  95.                    
  96.         except IndexError as InErr:
  97.             print "InErr", InErr
  98.        
  99.            
  100. def main():
  101.     app = QApplication(sys.argv)
  102.     window = MyCustomDialog()
  103.     window.resize(200, 50)
  104.     window.show()
  105.     sys.exit(app.exec_())
  106.  
  107. if __name__ == "__main__":
  108.     main()
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Sonntag 23. Juli 2017, 15:55

Hallo Leute, ich habe den obigen Quelltext ein wenig aufgeräumt und nach ewigem Grübeln habe ich es auch geschafft, dass die QTreeView() beim Anklicken der QComboBox() angezeigt wird. Die QHeaderView() lässt sich vermittels der hide()-Methode auch nun verstecken.

Bild

Jetzt fehlt mir noch das Verstecken der ersten Spalte. Dazu habe ich (wie ihr in Zeilen 24 und 25 sehen könnte) mich an zwei Möglichkeiten bedient. Die erste Möglichkeit, die mir auch sofort einfiel, war die setColumnHidden()-Methode. Sie funktioniert nicht, wirft aber auch keinerlei Fehler. Die nächste Möglichkeit ist die hideSection()-Methode, die ich aber erst anwenden kann, wenn ich zunächst über header() gehe, um somit die QHeaderView()-Klasse zu bekommen. Schließlich weißt ja die QHeaderView über die Spalten bescheid, und sollte sie verstecken können. Aber auch erfolglos. Keinerlei Fehlermeldung.

Hat keiner eine Idee?

  1. import sys
  2. from PyQt4.QtCore import Qt, QVariant
  3. from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
  4.                          QVBoxLayout, QPushButton
  5.  
  6. class MyCustomDialog(QDialog):
  7.     def __init__(self, parent=None):
  8.         QDialog.__init__(self, parent)
  9.  
  10.         self.standard_item_model = QStandardItemModel(0, 2)
  11.         self.set_header_data(list_header_data = ["ID", "Data"])
  12.  
  13.         self.items = [
  14.             ["0", 'Cookie dough'],
  15.             ["1", 'Hummus'],
  16.             ["2", 'Spaghetti'],
  17.             ["3", 'Dal makhani'],
  18.             ["4", 'Chocolate whipped cream']
  19.         ]
  20.        
  21.         self.tree_view = QTreeView(self)
  22.         self.tree_view.setRootIsDecorated(False)
  23.         self.tree_view.header().hide()
  24.         #self.tree_view.header().hideSection(0)
  25.         #self.tree_view.setColumnHidden(0, True)
  26.  
  27.         self.combo_box = QComboBox(self)
  28.  
  29.         self.combo_box.setView(self.tree_view)
  30.         self.combo_box.setModel(self.standard_item_model)
  31.  
  32.         self.push_button = QPushButton(self)
  33.         self.push_button.setText("Populate in TreeView")
  34.        
  35.         layout = QVBoxLayout(self)
  36.         layout.addWidget(self.combo_box)
  37.         layout.addWidget(self.push_button)
  38.         self.setLayout(layout)
  39.  
  40.         self.selection_changed()
  41.         self.init_signal_clicked_push_button()
  42.  
  43.     def selection_changed(self):
  44.         self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
  45.                     self.get_id_tree_view(new_index=new_index, tree_view_object=self.tree_view))
  46.  
  47.  
  48.     def generator_header_data(self, list_header):
  49.  
  50.         for header_data in list_header:
  51.             yield header_data
  52.            
  53.     def set_header_data(self, list_header_data=None):
  54.  
  55.         count_column = 0
  56.  
  57.         for header_data in self.generator_header_data(list_header_data):
  58.             self.standard_item_model.setHeaderData(count_column, Qt.Horizontal, header_data)
  59.  
  60.             count_column +=1
  61.  
  62.         return
  63.        
  64.     def populate_data_item(self, tuple_items):
  65.        
  66.         count_items = len(tuple_items)
  67.  
  68.         if count_items == 2:
  69.  
  70.             item_first, item_second = tuple_items
  71.  
  72.         two_columns_item = [QStandardItem(str(item_first)), QStandardItem(item_second)]
  73.  
  74.         self.standard_item_model.appendRow(two_columns_item)
  75.  
  76.         return      
  77.  
  78.     def get_id_tree_view(self, new_index=None,
  79.                          tree_view_object=None,):
  80.  
  81.         try:
  82.             if not new_index is None:
  83.  
  84.                 index = new_index.indexes()[0].data()#.toPyObject()
  85.  
  86.                 if isinstance(index, QVariant):
  87.                     print "index", index.toString()
  88.                    
  89.         except IndexError as InErr:
  90.             print "InErr", InErr
  91.  
  92.     def populate(self):
  93.         for i in self.items:
  94.             self.populate_data_item(i)
  95.  
  96.        
  97.  
  98.     def init_signal_clicked_push_button(self):
  99.        
  100.         self.push_button.clicked.connect(self.populate)
  101.        
  102.            
  103. def main():
  104.     app = QApplication(sys.argv)
  105.     window = MyCustomDialog()
  106.     window.resize(300, 50)
  107.     window.show()
  108.     sys.exit(app.exec_())
  109.  
  110. if __name__ == "__main__":
  111.     main()
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Sonntag 23. Juli 2017, 22:28

Ein weiteres Update: Mich lässt die ganze Sache keine Ruhe. Also habe ich weiter nachgeforscht. In Zeile 30 und 31 habe ich die view()-Methode auf die QComboBox() angewendet, um somit durch Umwege auf die QTreeView() zuzugreifen und die erste Spalte zu verstecken. Also, das Verstecken der QHeaderView() klappt über diesem Wege nach wie vor, nur das mit der Spalte will nicht klappen. Irgendwie drehe ich mich wohl im Kreise.

  1. import sys
  2. from PyQt4.QtCore import Qt, QVariant
  3. from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
  4.                          QVBoxLayout, QPushButton
  5.  
  6. class MyCustomDialog(QDialog):
  7.     def __init__(self, parent=None):
  8.         QDialog.__init__(self, parent)
  9.  
  10.         self.standard_item_model = QStandardItemModel(0,2, self)
  11.         self.set_header_data(list_header_data = ["ID", "Data"])
  12.  
  13.         self.items = [
  14.             ["0", 'Cookie dough'],
  15.             ["1", 'Hummus'],
  16.             ["2", 'Spaghetti'],
  17.             ["3", 'Dal makhani'],
  18.             ["4", 'Chocolate whipped cream']
  19.         ]
  20.        
  21.         self.tree_view = QTreeView(self)
  22.         self.tree_view.setRootIsDecorated(False)
  23.         #self.tree_view.header().hide()
  24.         #self.tree_view.header().hideSection(0)
  25.         #self.tree_view.setColumnHidden(0, True)
  26.  
  27.         self.combo_box = QComboBox(self)
  28.         self.combo_box.setView(self.tree_view)      
  29.         self.combo_box.setModel(self.standard_item_model)
  30.         self.combo_box.view().setHeaderHidden(True)
  31.         self.combo_box.view().header().hideSection(0)
  32.  
  33.         self.push_button_load = QPushButton(self)
  34.         self.push_button_load.setText("Populate in TreeView")
  35.  
  36.         self.push_button_hide_column = QPushButton(self)
  37.         self.push_button_hide_column.setText("Hide first column")
  38.        
  39.         layout = QVBoxLayout(self)
  40.         layout.addWidget(self.combo_box)
  41.         layout.addWidget(self.push_button_load)
  42.         layout.addWidget(self.push_button_hide_column)
  43.         self.setLayout(layout)
  44.  
  45.         self.selection_changed()
  46.         self.init_signal_clicked_push_button()
  47.  
  48.     def selection_changed(self):
  49.         self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
  50.                     self.get_id_tree_view(new_index=new_index, tree_view_object=self.tree_view))
  51.  
  52.  
  53.     def generator_header_data(self, list_header):
  54.  
  55.         for header_data in list_header:
  56.             yield header_data
  57.            
  58.     def set_header_data(self, list_header_data=None):
  59.  
  60.         count_column = 0
  61.  
  62.         for header_data in self.generator_header_data(list_header_data):
  63.             self.standard_item_model.setHeaderData(count_column, Qt.Horizontal, header_data)
  64.  
  65.             count_column +=1
  66.  
  67.         return
  68.        
  69.     def populate_data_item(self, tuple_items):
  70.        
  71.         count_items = len(tuple_items)
  72.  
  73.         if count_items == 2:
  74.  
  75.             item_first, item_second = tuple_items
  76.  
  77.         two_columns_item = [QStandardItem(str(item_first)), QStandardItem(item_second)]
  78.  
  79.         self.standard_item_model.appendRow(two_columns_item)
  80.  
  81.         return      
  82.  
  83.     def get_id_tree_view(self, new_index=None,
  84.                          tree_view_object=None,):
  85.  
  86.         try:
  87.             if not new_index is None:
  88.  
  89.                 index = new_index.indexes()[0].data()#.toPyObject()
  90.  
  91.                 if isinstance(index, QVariant):
  92.                     print "index", index.toString()
  93.                    
  94.         except IndexError as InErr:
  95.             print "InErr", InErr
  96.  
  97.     def populate(self):
  98.         for i in self.items:
  99.             self.populate_data_item(i)
  100.  
  101.        
  102.  
  103.     def init_signal_clicked_push_button(self):
  104.        
  105.         self.push_button_load.clicked.connect(self.populate)
  106.  
  107.         self.push_button_hide_column.clicked.connect(self.hide_column)
  108.        
  109.            
  110. def main():
  111.     app = QApplication(sys.argv)
  112.     window = MyCustomDialog()
  113.     window.resize(300, 50)
  114.     window.show()
  115.     sys.exit(app.exec_())
  116.  
  117. if __name__ == "__main__":
  118.     main()
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Montag 24. Juli 2017, 14:55

Hallo Leute,

ich habe echt den Kopf zerbrochen, und bin auf eine, aus meiner Sicht, recht unzufriedene Lösung gekommen. Ich habe den nachfolgenden Quelltext noch einmal neu strukturiert. Aber der eigentliche Kern ist, dass ich durch einen blöden, aber wirklich blöden Zufall auf die setMinimumSize()-Methode gestoßen bin, und diese dann auf QTreeView() anwende. Würde ich diese besagte Methode beiseite lassen, würde sich die QTreeView() gar nicht erst per Drop-Down in der QTreeViewQComboBox() anzeigen lassen. Irgendwie erscheint mir meine Lösung nicht ganz Spruchreif. Vielleicht hat jemand eine bessere Idee? Ich meine, es kann ja nicht sein, dass es tatsächlich von der setMinimumSize() -Methode abhängt? Des Weiteren musste ich die resizeEvent()-Methode implementieren, damit ich die Breite der ComboBox bekomme, um die QTreeView durch die setMinimumSize()-Methode anpassen zu können, und es wird auch gleich die QTreeView() in der implementierten resizeEvent()-Methode angepasst.

  1. import sys
  2. from PyQt4.QtCore import Qt, QVariant
  3. from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
  4.                          QVBoxLayout, QPushButton
  5.  
  6. class MyCustomDialog(QDialog):
  7.     def __init__(self, parent=None):
  8.         QDialog.__init__(self, parent)
  9.  
  10.         # First of all, it will be vreated a attribute
  11.         combo_width = 0
  12.  
  13.         # Second, we need our QTreeView() and
  14.         # the settings
  15.         self.tree_view = QTreeView(self)
  16.         self.tree_view.setMinimumSize(combo_width, 120)
  17.         self.tree_view.header().hide()
  18.  
  19.         # Create an empty model for the TreeViews' data
  20.         _standard_item_model = QStandardItemModel(0,2)
  21.  
  22.        # Add some textual items
  23.         self.food_list = [
  24.                     ["0", 'Cookie dough'],
  25.                     ["1", 'Hummus'],
  26.                     ["2", 'Spaghetti'],
  27.                     ["3", 'Dal makhani'],
  28.                     ["4", 'Chocolate whipped cream']
  29.                 ]
  30.         # Now its time to populate data
  31.         self.populate(model=_standard_item_model)
  32.  
  33.         # Well we also want to set the header
  34.         self.set_header_data(list_header_data = ["ID", "Genre"], model=_standard_item_model)
  35.  
  36.         # QComboBox() will be created
  37.         self.combo_box = QComboBox(self)
  38.  
  39.         # we have to initialize the QComboBox() and apply the model
  40.         self.init_combo(model=_standard_item_model)
  41.  
  42.         # set the selectionChanged to QTreeView()
  43.         self.selection_changed()
  44.  
  45.         # layout is a defined QVBoxLayout()
  46.         layout = QVBoxLayout(self)
  47.         layout.addWidget(self.combo_box)
  48.         self.setLayout(layout)
  49.  
  50.     def init_combo(self, model=None):
  51.  
  52.         self.combo_box.setView(self.tree_view)        
  53.         self.combo_box.setModel(model)
  54.  
  55.     def selection_changed(self):
  56.        
  57.         self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
  58.                     self.get_id_tree_view(new_index=new_index, tree_view_object=self.tree_view))
  59.  
  60.  
  61.     def generator_header_data(self, list_header):
  62.  
  63.         for header_data in list_header:
  64.             yield header_data
  65.            
  66.     def set_header_data(self, list_header_data=None, model=None):
  67.  
  68.         count_column = 0
  69.  
  70.         for header_data in self.generator_header_data(list_header_data):
  71.             model.setHeaderData(count_column, Qt.Horizontal, header_data)
  72.  
  73.             count_column +=1
  74.  
  75.     def get_id_tree_view(self, new_index=None,
  76.                          tree_view_object=None,):
  77.  
  78.         try:
  79.             if not new_index is None:
  80.  
  81.                 index = new_index.indexes()[1].data()#.toPyObject()
  82.  
  83.                 if isinstance(index, QVariant):
  84.                     print "index", index.toString()
  85.                    
  86.         except IndexError as InErr:
  87.             print "InErr", InErr
  88.  
  89.     def populate_data_item(self, item_list=None, model=None):
  90.        
  91.         count_items = len(item_list)
  92.  
  93.         if count_items == 2:
  94.  
  95.             item_first, item_second = item_list
  96.  
  97.         two_columns_item = [QStandardItem(item_second), QStandardItem(str(item_first))]
  98.  
  99.         model.appendRow(two_columns_item)
  100.  
  101.     def populate(self, model=None):
  102.        
  103.         for single_list in self.food_list:
  104.             self.populate_data_item(item_list=single_list, model=model)
  105.  
  106.     def resizeEvent(self, evt=None):
  107.         '''
  108.            We need to re-implement the resizeEvent()-method
  109.            to get width of the QComboBox() and to set the
  110.            QTreeView()
  111.        '''
  112.         combo_width = self.combo_box.width()
  113.         self.tree_view.resizeColumnToContents(0)
  114.         self.tree_view.setColumnHidden(1, True)
  115.            
  116. def main():
  117.     app = QApplication(sys.argv)
  118.     window = MyCustomDialog()
  119.     window.resize(300, 50)
  120.     window.show()
  121.     sys.exit(app.exec_())
  122.  
  123. if __name__ == "__main__":
  124.     main()
BlackJack

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon BlackJack » Montag 24. Juli 2017, 15:50

@Sophus: Nur geraten, aber vielleicht würde es auch einfach helfen wenn man den `QTreeView` zu einem Layout hinzufügt damit Qt weiss wo und wie gross es angezeigt werden kann/soll‽
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Montag 24. Juli 2017, 16:29

@BlackJack: Auf die Idee bin ich ganz zu Anfang gekommen, als ich QTreeView() unabsichtlich zum Layout hinzugefügt habe. Aber dann hält das Layout QTreeView() tatsächlich fest, und das Objekt erscheint dann nicht mehr in der QComboBox(). Die setView()-Methode greift hier dann nicht mehr, da QTreeView() vom Layout festgekrallt wird.
BlackJack

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon BlackJack » Montag 24. Juli 2017, 17:00

@Sophus: Okay, es war wie gesagt nur geraten, ich wusste nicht das Du den TreeView *in* der Combobox anzeigen wolltest.

Wobei mir da gerade auffällt das bei `Combobox.setView()` eine Anmerkung in der Dokumentation steht die Du nicht beachtest: Das Model soll *vor* dem Aufruf dieser Methode der Combobox hinzugefügt werden. Keine Ahnung ob das irgendwelche Auswirkungen auf Dein Problem hat.
Benutzeravatar
Sophus
User
Beiträge: 1031
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Re: QTreeView() und das Verschwinden lassen einer bestimmten Spalte

Beitragvon Sophus » Montag 24. Juli 2017, 18:10

@BlackJack: Ich habe deine Anmerkung berücksichtigt, und die setModel()-Methode zuerst auf die QComboBox() angewendet, ehe ich dann im Anschluss die setView()-Methode auf die QComboBox() anwende. Soweit macht das Programm, was es soll. Eine Kleinigkeit fehlt mir jedoch. Diese findet ihr unter Meine Wunschliste - Verbesserungswusch.

Änderungen im Überblick:

- In Zeile 13 habe ich die setMinimumSize()-Methode durch die setRootIsDecorated(False)()-Methode ersetzt. Bei dem Boolean-Wert ist es gleich ob True oder False. Ich habe es auf False gesetzt, da ich in meinem Fall nicht mit der Hierarchie arbeiten will, sondern nur mit Zeilen und Spalten.

- Ich konnte die resizeEvent()-Methode, die ich zuvor re-implementiert habe, wieder entfernen. Die Breite und Höhe der QTreeView() wird automatisch berechnet.

- Mit einem Blick in die populate_data_item()-Methode (Zeile 112) habe ich die Anordnung der Daten-Elemente (in Zeile 120) geändert. Zuvor habe ich erst die IDs, und dann die Daten ausgeben lassen. Da ich aber vordergründig die Daten ausgeben will, und nur im Hintergrund mit den IDs arbeiten will, habe ich die Reihenfolge getauscht. Erst die Daten, dann die IDs. Die IDs sind jetzt in der zweiten Spalte.

Meine Wunschliste - Verbesserungswusch:

- In Zeile 69 ist die on_combo_box_changed()-Methode zu sehen. Man kennt ja die Eigentümlichkeiten bei ComboBoxen. Wenn dieser aktiviert wurde, kann man mit den Cursor-Tasen (nach oben und nach unten) durch die Daten in der ComboBox navigieren. Bei einer einfachen Verwendung führt man entweder die currentIndexChanged ()- und/oder activated[str]()-Signale auf der ComboBox aus, um die entsprechenden Eintragenen ausgeben zu können, damit man weiß, welches Element der Benutzer nun in der ComboBox ausgewählt hat. Leider klappt das in meinem Fall nicht. Wenn ich die ComboBox (zum Beispiel durch die TAB-Taste) aktiviere und mit den Cursor-Tasten navigiere, bekomme ich nicht das aktuelle Daten-Element. Und dann will ich an die IDs kommen, die in der zweiten Spalte sind.

Hat jemand eine Idee?


  1. import sys
  2. from PyQt4.QtCore import Qt, QVariant
  3. from PyQt4.QtGui import QApplication, QStandardItemModel, QStandardItem, QTreeView, QComboBox, QDialog, \
  4.                          QVBoxLayout, QPushButton
  5.  
  6. class MyCustomDialog(QDialog):
  7.     def __init__(self, parent=None):
  8.         QDialog.__init__(self, parent)
  9.  
  10.         # Second, we need our QTreeView() and
  11.         # the settings
  12.         self.tree_view = QTreeView(self)
  13.         self.tree_view.setRootIsDecorated(False)
  14.         self.tree_view.setWordWrap(True)
  15.         self.tree_view.header().hide()
  16.  
  17.         # Create an empty model for the TreeViews' data
  18.         _standard_item_model = QStandardItemModel(0,2)
  19.  
  20.        # Add some textual items
  21.         self.food_list = [
  22.                     ["0", 'Cookie dough'],
  23.                     ["1", 'Hummus'],
  24.                     ["2", 'Spaghetti'],
  25.                     ["3", 'Dal makhani'],
  26.                     ["666", 'Hummus'],
  27.                     ["4", 'Spaghetti'],
  28.                     ["3", 'Dal makhani'],
  29.                     ["4", 'Chocolate whipped cream']
  30.                 ]
  31.         # Now its time to populate data
  32.         self.populate(model=_standard_item_model)
  33.  
  34.         # Well we also want to set the header
  35.         self.set_header_data(list_header_data = ["ID", "Genre"], model=_standard_item_model)
  36.  
  37.         # Apply the model to the list view
  38.         self.set_tree_view_model(_standard_item_model)
  39.  
  40.         # QComboBox() will be created
  41.         self.combo_box = QComboBox(self)
  42.  
  43.         # we have to initialize the QComboBox()
  44.         self.init_combo(model=_standard_item_model)
  45.  
  46.         # set the selectionChanged to QTreeView()
  47.         self.selection_changed()
  48.  
  49.         # layout is a defined QVBoxLayout()
  50.         layout = QVBoxLayout(self)
  51.         layout.addWidget(self.combo_box)
  52.         self.setLayout(layout)
  53.  
  54.     def set_tree_view_model(self, model):
  55.        
  56.         self.tree_view.setModel(model)
  57.  
  58.     def init_combo(self, model=None):
  59.        
  60.         self.combo_box.setModel(model)
  61.         self.combo_box.setView(self.tree_view)
  62.  
  63.         self.combo_box.currentIndexChanged.connect(lambda:
  64.                                               self.on_combo_box_changed(model_index=self.combo_box.view().currentIndex()))
  65.  
  66.         self.tree_view.resizeColumnToContents(0)
  67.         self.tree_view.setColumnHidden(1, True)
  68.  
  69.     def on_combo_box_changed(self, model_index=None):
  70.         '''display text of selected item '''
  71.  
  72.         # Get the index first,
  73.  
  74.         new_indx = model_index.data(0).toString() # data method of QModelIndex is a
  75.                                                  # convenient method for getting the d
  76.                                                  # isplay text for that particular index
  77.  
  78.         print "index", new_indx
  79.  
  80.     def selection_changed(self):
  81.        
  82.         self.tree_view.selectionModel().selectionChanged.connect(lambda new_index:
  83.                     self.get_id_tree_view(new_index=new_index))        
  84.  
  85.     def generator_header_data(self, list_header):
  86.  
  87.         for header_data in list_header:
  88.             yield header_data
  89.            
  90.     def set_header_data(self, list_header_data=None, model=None):
  91.  
  92.         count_column = 0
  93.  
  94.         for header_data in self.generator_header_data(list_header_data):
  95.             model.setHeaderData(count_column, Qt.Horizontal, header_data)
  96.  
  97.             count_column +=1
  98.  
  99.     def get_id_tree_view(self, new_index=None):
  100.  
  101.         try:
  102.             if not new_index is None:
  103.  
  104.                 index = new_index.indexes()[1].data()#.toPyObject()
  105.  
  106.                 if isinstance(index, QVariant):
  107.                     print "index", index.toString()
  108.                    
  109.         except IndexError as InErr:
  110.             pass#print "InErr", InErr
  111.  
  112.     def populate_data_item(self, item_list=None, model=None):
  113.        
  114.         count_items = len(item_list)
  115.  
  116.         if count_items == 2:
  117.  
  118.             item_first, item_second = item_list
  119.  
  120.         two_columns_item = [QStandardItem(item_second), QStandardItem(str(item_first))]
  121.  
  122.         model.appendRow(two_columns_item)
  123.  
  124.     def populate(self, model=None):
  125.        
  126.         for single_list in self.food_list:
  127.             self.populate_data_item(item_list=single_list, model=model)
  128.  
  129.            
  130. def main():
  131.     app = QApplication(sys.argv)
  132.     window = MyCustomDialog()
  133.     window.resize(300, 50)
  134.     window.show()
  135.     sys.exit(app.exec_())
  136.  
  137. if __name__ == "__main__":
  138.     main()

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder