Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. QTreeWidget::selectedItems()

QTreeWidget::selectedItems()

Scheduled Pinned Locked Moved Unsolved German
17 Posts 4 Posters 1.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    kahemenne
    wrote on last edited by
    #1

    Hallo,
    ich habe im QT Creator einen QTreeWidget in Python erzeugt.
    Wenn ich mit selectedItems nach frage erhalte ich keine Liste, sonden ein Object zurück.
    Was mache ich falsch oder verstehe etwas falsch?

    QList<QTreeWidgetItem *> QTreeWidget::selectedItems() const

    Returns a list of all selected non-hidden items.

    print(f'selectedItems: {self.w.katTWKategorien.selectedItems()}')

    selectedItems: [<PySide6.QtWidgets.QTreeWidgetItem object at 0x00000233409EAF80>]

    1 Reply Last reply
    0
    • Axel SpoerlA Offline
      Axel SpoerlA Offline
      Axel Spoerl
      Moderators
      wrote on last edited by
      #2

      Hallo @kahemenne
      QTreeWidget::selectedItems() liefert eine QList<QTreeWidgetItem *>.
      Ohne den zugrundeliegenden Code und die verwendete Qt Version zu kennen, tippe ich darauf, dass die Liste im vorliegenden Fall nur ein Element enthält.
      LG
      Axel

      Software Engineer
      The Qt Company, Oslo

      1 Reply Last reply
      0
      • K Offline
        K Offline
        kahemenne
        wrote on last edited by
        #3

        Danke für die Antwort.
        Aber wie bekomme ich den nun den Inhalt des Items?
        Gruß
        Karl-Heinz

        1 Reply Last reply
        0
        • Axel SpoerlA Offline
          Axel SpoerlA Offline
          Axel Spoerl
          Moderators
          wrote on last edited by Axel Spoerl
          #4

          Servus Karl-Heinz,
          es ist formal nicht garantiert, dass die Liste nur ein Item enthält.
          Da das Selektieren Angelegenheit des Benutzers ist, kann die Liste entweder keines, eines oder mehrere items enthalten.
          Man muss also über die Liste iterieren, um dann auf die items zugreifen zu können. Ein ranged for-loop ist mir (als faulem Österreicher) da am angenehmsten.

          const QList items = pointerToMyTreeWidget->selectedItems();
          for (auto &item : items) {
              qDebug() << item->isSelected(); // wehe, wenn's nicht selektiert ist ;-)
              // do whatever needs to be done
          }
          

          Wenn ein code path sicher nur dann erreicht wird, wenn genau ein Item selektiert ist, geht es auch so:

          const QList items = pointerToMyTreeWidget->selectedItems();
          
          // do nothing unless exactly one item has been selected
          if (items.count != 1)
              return;
          
          // or, alternatively: fail gracefully, unless exactly one item has been selected
          Q_ASSUME(items.count() == 1);
          
          // List contains exactly one item => grab its pointer
          QTreeWidgetItem *item = items.at(0);
          qDebug() << item->isSelected();
          // do whatever needs to be done
          
          return;
          

          LG
          Axel

          Software Engineer
          The Qt Company, Oslo

          1 Reply Last reply
          1
          • K Offline
            K Offline
            kahemenne
            wrote on last edited by
            #5

            Hallo Axel,
            danke.
            Habe ich auch schon probiert:
            selectedItems: [<PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>]
            item: <PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>

            wie Du sieht kommt auch dort nur ein Object zurück.
            Wie kann ich im creator die verwendete QT-Version harausfinden?
            Ich programmiere überings in Python. D.h. ich muss die C-Anweisungen im Kopf immer in Python konvertieren.
            Ich dachte immer wenn ich die Funktion ohne () aufrufe bekomme ich das Object und mit Klammer das Ergebnis der Funktion.
            In diesem Fall kommt im beiden Fällen das Object zurück.
            Gruß
            Karl-Heinz

            Pl45m4P 1 Reply Last reply
            0
            • Axel SpoerlA Offline
              Axel SpoerlA Offline
              Axel Spoerl
              Moderators
              wrote on last edited by
              #6

              Hallo Karl-Heinz,
              Bei den Details zu Python kann ich leider keine Stegreifaufgaben lösen.
              Wenn sich bis dahin kein Experte mit erschöpfender Antwort findet, melde ich mich morgen früh ausm Büro.
              LG
              Axel

              Software Engineer
              The Qt Company, Oslo

              1 Reply Last reply
              0
              • K kahemenne

                Hallo Axel,
                danke.
                Habe ich auch schon probiert:
                selectedItems: [<PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>]
                item: <PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>

                wie Du sieht kommt auch dort nur ein Object zurück.
                Wie kann ich im creator die verwendete QT-Version harausfinden?
                Ich programmiere überings in Python. D.h. ich muss die C-Anweisungen im Kopf immer in Python konvertieren.
                Ich dachte immer wenn ich die Funktion ohne () aufrufe bekomme ich das Object und mit Klammer das Ergebnis der Funktion.
                In diesem Fall kommt im beiden Fällen das Object zurück.
                Gruß
                Karl-Heinz

                Pl45m4P Offline
                Pl45m4P Offline
                Pl45m4
                wrote on last edited by
                #7

                @kahemenne said in QTreeWidget::selectedItems():

                item: <PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>
                wie Du sieht kommt auch dort nur ein Object zurück.

                Ist die Frage, warum nur ein Objekt zurückkommt oder warum dort object steht?
                Soweit ich sehe, ist das doch ein PySide6.QtWidgets.QTreeWidgetItem und dieses "object" befindet sich an Adresse 0x000...
                Es müsste sich dabei um die Adresse des ersten Items in der Liste der markierten Items handeln, egal wie lang die im Endeffekt ist.

                @kahemenne said in QTreeWidget::selectedItems():

                Wie kann ich im creator die verwendete QT-Version harausfinden?

                Unter "Kits"

                @kahemenne said in QTreeWidget::selectedItems():

                Ich dachte immer wenn ich die Funktion ohne () aufrufe

                Ohne Klammern ( ) ist, auch in Python, nie ein Funktionsaufruf des Funktionscodes selbst. Ohne Klammer bekommt man eine Referenz auf die Funktion an sich zurück.


                If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                ~E. W. Dijkstra

                K 1 Reply Last reply
                1
                • Pl45m4P Pl45m4

                  @kahemenne said in QTreeWidget::selectedItems():

                  item: <PySide6.QtWidgets.QTreeWidgetItem object at 0x000001ABE276F2C0>
                  wie Du sieht kommt auch dort nur ein Object zurück.

                  Ist die Frage, warum nur ein Objekt zurückkommt oder warum dort object steht?
                  Soweit ich sehe, ist das doch ein PySide6.QtWidgets.QTreeWidgetItem und dieses "object" befindet sich an Adresse 0x000...
                  Es müsste sich dabei um die Adresse des ersten Items in der Liste der markierten Items handeln, egal wie lang die im Endeffekt ist.

                  @kahemenne said in QTreeWidget::selectedItems():

                  Wie kann ich im creator die verwendete QT-Version harausfinden?

                  Unter "Kits"

                  @kahemenne said in QTreeWidget::selectedItems():

                  Ich dachte immer wenn ich die Funktion ohne () aufrufe

                  Ohne Klammern ( ) ist, auch in Python, nie ein Funktionsaufruf des Funktionscodes selbst. Ohne Klammer bekommt man eine Referenz auf die Funktion an sich zurück.

                  K Offline
                  K Offline
                  kahemenne
                  wrote on last edited by
                  #8

                  Hallo Pl45m4,
                  auch Dir ein Dankeschön für Deinen Reply.
                  Leider weiß ich immer noch nicht wie ich eine selektiertes Item erkennen kann.
                  Gruß
                  Karl-Heinz

                  1 Reply Last reply
                  0
                  • Axel SpoerlA Offline
                    Axel SpoerlA Offline
                    Axel Spoerl
                    Moderators
                    wrote on last edited by
                    #9

                    Hallo Karl-Heinz,
                    im Gegensatz zur QList-Klasse in C++ sind Listen in Python implizit, siehe hier.
                    Wie gesagt, bin ich keine Python, aber in etwa sollte Dir...
                    len(self.w.katTWKategorien.selectedItems()) ...die Anzahl der selektierten Items und
                    self.w.katTWKategorien.selectedItems()[0] ...den Pointer aufs erste Item liefern.
                    LG
                    Axel

                    Software Engineer
                    The Qt Company, Oslo

                    1 Reply Last reply
                    1
                    • K Offline
                      K Offline
                      kahemenne
                      wrote on last edited by
                      #10

                      Hallo Axel,
                      ja Du hast recht. Aber.
                      In Python kann ich mit Pointern nichts anfangen.
                      Wenn ich die analogie zur Klasse QTableWidgetItem nehme gibt es dort Functionen
                      wie raw oder text. die geben mir bezüge zum selectierten Item.
                      So wie ich das sehe gibt es dies bei QtreeWidgetItem nicht.
                      Weiß Du dazu eine Lösung?
                      Gruß
                      Karl-Heinz

                      jsulmJ 1 Reply Last reply
                      0
                      • K kahemenne

                        Hallo Axel,
                        ja Du hast recht. Aber.
                        In Python kann ich mit Pointern nichts anfangen.
                        Wenn ich die analogie zur Klasse QTableWidgetItem nehme gibt es dort Functionen
                        wie raw oder text. die geben mir bezüge zum selectierten Item.
                        So wie ich das sehe gibt es dies bei QtreeWidgetItem nicht.
                        Weiß Du dazu eine Lösung?
                        Gruß
                        Karl-Heinz

                        jsulmJ Offline
                        jsulmJ Offline
                        jsulm
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        @kahemenne said in QTreeWidget::selectedItems():

                        So wie ich das sehe gibt es dies bei QtreeWidgetItem nicht.

                        Gibt es was nicht? QtreeWidgetItem ist nur ein Item in einem QTreeWidget. Selectieren kann man in einem QTreeWidget, nicht QtreeWidgetItem.

                        https://forum.qt.io/topic/113070/qt-code-of-conduct

                        1 Reply Last reply
                        0
                        • K Offline
                          K Offline
                          kahemenne
                          wrote on last edited by
                          #12

                          Ja das ist richtig, aber man bekommt ein QtreeWidgetItem zurück.
                          Womit man arbeiten kann.
                          Gruß
                          Karl-Heinz

                          Pl45m4P 1 Reply Last reply
                          0
                          • K kahemenne

                            Ja das ist richtig, aber man bekommt ein QtreeWidgetItem zurück.
                            Womit man arbeiten kann.
                            Gruß
                            Karl-Heinz

                            Pl45m4P Offline
                            Pl45m4P Offline
                            Pl45m4
                            wrote on last edited by
                            #13

                            @kahemenne said in QTreeWidget::selectedItems():

                            Ja das ist richtig, aber man bekommt ein QtreeWidgetItem zurück.

                            Ja eben... man bekommt eine Liste mit allen selektierten Items im TreeWidget.
                            Wenn nur ein Item markiert ist, hat die Liste auch nur ein Element.
                            Verstehe das Problem nicht :)


                            If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                            ~E. W. Dijkstra

                            K 1 Reply Last reply
                            0
                            • Pl45m4P Pl45m4

                              @kahemenne said in QTreeWidget::selectedItems():

                              Ja das ist richtig, aber man bekommt ein QtreeWidgetItem zurück.

                              Ja eben... man bekommt eine Liste mit allen selektierten Items im TreeWidget.
                              Wenn nur ein Item markiert ist, hat die Liste auch nur ein Element.
                              Verstehe das Problem nicht :)

                              K Offline
                              K Offline
                              kahemenne
                              wrote on last edited by
                              #14

                              @Pl45m4
                              Hallo,
                              Ja nochmal, ich bekomme keine Liste und kein Item,
                              sonder einen Zeiger auf etwas zurück.
                              Leider kann ich in Python damit nichts anfangen.
                              Danke für Euer Verständnis.
                              Gruß
                              Karl-Heinz

                              Pl45m4P 1 Reply Last reply
                              0
                              • K kahemenne

                                @Pl45m4
                                Hallo,
                                Ja nochmal, ich bekomme keine Liste und kein Item,
                                sonder einen Zeiger auf etwas zurück.
                                Leider kann ich in Python damit nichts anfangen.
                                Danke für Euer Verständnis.
                                Gruß
                                Karl-Heinz

                                Pl45m4P Offline
                                Pl45m4P Offline
                                Pl45m4
                                wrote on last edited by Pl45m4
                                #15

                                @kahemenne said in QTreeWidget::selectedItems():

                                ich bekomme keine Liste und kein Item, sondern einen Zeiger auf etwas zurück.

                                Das bezweifle ich. Zeiger an sich gibt es in Python nicht.

                                Ich glaub, irgendwie reden wir alle aneinander vorbei.

                                Im ursprünglichen Code schreibst du:

                                print(f'selectedItems: {self.w.katTWKategorien.selectedItems()}')
                                

                                Und bekommst

                                selectedItems: [<PySide6.QtWidgets.QTreeWidgetItem object at 0x00000233409EAF80>]
                                

                                Um die Ausgabe mal auseinander zu brechen:

                                • selectedItems ist natürlich der Text, den du selbst im "print" geschrieben hast.
                                • Darauf folgt ein Inhalt in eckigen Klammern, der bei Python auf die Ausgabe eines Containers vom Typ "List" hinweist. (Steht ja auch in der Doku: "Returns a list of all selected non-hidden items.")
                                • Zwischen den [... ] befindet sich der Inhalt der Liste... In deinem Fall genau ein Objekt, vom Typ PySide6.QtWidgets.QTreeWidgetItem, also ein QTreeWidgetItem. Das at 0x00.... beschreibt nur den Speicher, wo sich das Objekt befindet. Das heißt nicht, dass du einen Pointer bekommst.

                                Ohne __str__ Funktion kann man Python-Objekte nicht mit print() einfach so "ausgeben". Weil ja auch nicht bekannt ist, was von dem Objekt ausgegeben werden sollte (woher auch?!). Das, was du da siehst, ist die "Standard-Ausgabe" eines Objekts, wenn man das so nennen will, bestehend aus dem Typ bzw. der Klasse des Objekts und eben dem Speicher.
                                Jedenfalls ist es kein Pointer und alles funktioniert so, wie es soll :)

                                Vielleicht hab ich das alles jetzt ein wenig zu "klein" erklärt, aber ich hoffe, es ist verständlich.
                                Nutze selbst Qt zu 99% nur in C++

                                Edit:

                                Versuch mal (Code nicht getestet):

                                print(f'selectedItems: { self.w.katTWKategorien.selectedItems()[0].text(0) }')
                                

                                Dies sollte dir den Text in der ersten Spalte des ersten Items zurückgeben... vorausgesetzt dort steht etwas. So kannst du verifizieren, dass dein selektiertes Item auch das ist, was selektiert ist.

                                https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QTreeWidgetItem.html#PySide2.QtWidgets.PySide2.QtWidgets.QTreeWidgetItem.text


                                If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                ~E. W. Dijkstra

                                K 1 Reply Last reply
                                1
                                • Pl45m4P Pl45m4

                                  @kahemenne said in QTreeWidget::selectedItems():

                                  ich bekomme keine Liste und kein Item, sondern einen Zeiger auf etwas zurück.

                                  Das bezweifle ich. Zeiger an sich gibt es in Python nicht.

                                  Ich glaub, irgendwie reden wir alle aneinander vorbei.

                                  Im ursprünglichen Code schreibst du:

                                  print(f'selectedItems: {self.w.katTWKategorien.selectedItems()}')
                                  

                                  Und bekommst

                                  selectedItems: [<PySide6.QtWidgets.QTreeWidgetItem object at 0x00000233409EAF80>]
                                  

                                  Um die Ausgabe mal auseinander zu brechen:

                                  • selectedItems ist natürlich der Text, den du selbst im "print" geschrieben hast.
                                  • Darauf folgt ein Inhalt in eckigen Klammern, der bei Python auf die Ausgabe eines Containers vom Typ "List" hinweist. (Steht ja auch in der Doku: "Returns a list of all selected non-hidden items.")
                                  • Zwischen den [... ] befindet sich der Inhalt der Liste... In deinem Fall genau ein Objekt, vom Typ PySide6.QtWidgets.QTreeWidgetItem, also ein QTreeWidgetItem. Das at 0x00.... beschreibt nur den Speicher, wo sich das Objekt befindet. Das heißt nicht, dass du einen Pointer bekommst.

                                  Ohne __str__ Funktion kann man Python-Objekte nicht mit print() einfach so "ausgeben". Weil ja auch nicht bekannt ist, was von dem Objekt ausgegeben werden sollte (woher auch?!). Das, was du da siehst, ist die "Standard-Ausgabe" eines Objekts, wenn man das so nennen will, bestehend aus dem Typ bzw. der Klasse des Objekts und eben dem Speicher.
                                  Jedenfalls ist es kein Pointer und alles funktioniert so, wie es soll :)

                                  Vielleicht hab ich das alles jetzt ein wenig zu "klein" erklärt, aber ich hoffe, es ist verständlich.
                                  Nutze selbst Qt zu 99% nur in C++

                                  Edit:

                                  Versuch mal (Code nicht getestet):

                                  print(f'selectedItems: { self.w.katTWKategorien.selectedItems()[0].text(0) }')
                                  

                                  Dies sollte dir den Text in der ersten Spalte des ersten Items zurückgeben... vorausgesetzt dort steht etwas. So kannst du verifizieren, dass dein selektiertes Item auch das ist, was selektiert ist.

                                  https://doc.qt.io/qtforpython-5/PySide2/QtWidgets/QTreeWidgetItem.html#PySide2.QtWidgets.PySide2.QtWidgets.QTreeWidgetItem.text

                                  K Offline
                                  K Offline
                                  kahemenne
                                  wrote on last edited by
                                  #16

                                  @Pl45m4
                                  Hallo,
                                  danke das war der entscheidene Tip. Zwar von Pyside2, da git es ein Argument.
                                  in Qt 6.4
                                  QString QTableWidgetItem::text() const

                                  Returns the item's text.

                                  See also setText().
                                  gibt es kein Argument. Und das führt zu einem Fehler.

                                  Nochmals Danke.
                                  Gruß
                                  Karl-Heinz

                                  Pl45m4P 1 Reply Last reply
                                  0
                                  • K kahemenne

                                    @Pl45m4
                                    Hallo,
                                    danke das war der entscheidene Tip. Zwar von Pyside2, da git es ein Argument.
                                    in Qt 6.4
                                    QString QTableWidgetItem::text() const

                                    Returns the item's text.

                                    See also setText().
                                    gibt es kein Argument. Und das führt zu einem Fehler.

                                    Nochmals Danke.
                                    Gruß
                                    Karl-Heinz

                                    Pl45m4P Offline
                                    Pl45m4P Offline
                                    Pl45m4
                                    wrote on last edited by
                                    #17

                                    @kahemenne said in QTreeWidget::selectedItems():

                                    QString QTableWidgetItem::text() const

                                    Ja bin bei der alten PySide2 Doku gelandet :) Wie gesagt, nutze PyQt kaum bis gar nicht...

                                    Aber du hast jetzt TABLE- und TREE-Widget verwechselt. Was ist es denn in echt? Tree oder TableWidget. Bei TreeWidget wird eine Spalte erwartet, da dein "Baum" ja mehrere Ebenen/Spalten haben kann.

                                    Hier nochmal die PySide6 Doku.

                                    PySide6.QtWidgets.QTreeWidgetItem.text(column)
                                    
                                    Parameters
                                    
                                        column – int
                                    Return type
                                    
                                        str
                                    
                                    Returns the text in the specified column.
                                    

                                    https://doc.qt.io/qtforpython/PySide6/QtWidgets/QTreeWidgetItem.html#PySide6.QtWidgets.PySide6.QtWidgets.QTreeWidgetItem.text


                                    If debugging is the process of removing software bugs, then programming must be the process of putting them in.

                                    ~E. W. Dijkstra

                                    1 Reply Last reply
                                    1

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved