Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. German
  4. Ein array von QTableWidgetItem's initialisieren?
Forum Update on Monday, May 27th 2025

Ein array von QTableWidgetItem's initialisieren?

Scheduled Pinned Locked Moved Solved German
16 Posts 5 Posters 4.8k 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.
  • P Offline
    P Offline
    peter_sailor
    wrote on last edited by
    #1

    Hallo liebe Forum-Mitglieder

    ich habe jetzt lange nach einer Lösungen gesucht, leider noch nichts gefunden.
    Ich möchte ein array von QWidgetItem's erstellen und initialiseren, so in der Form:

    QTableWidgetItem *feld[64];
    for (zelle=0; xxx; zelle++)
    yyy->setItem(x,y,feld[zelle])

    Hier stürzt das Programm ab. Offensichtlich mag die Funktion setItem kein Array.
    Ich habe dann das Problem so gelöst:

    QTableWidgetItem *feld[64];
    QTableWidgetItem *item0 = new QTableWidgetItem();
    yyy->setItem(7,0, item0);
    feld[zelle] = item0; // diese zuweisung funktioniert
    zelle++;

    Bei mehr als 50 Item's/Zellen ist das viel Handarbeit. Kennt jemand eine funktionierende bessere Lösung?

    Vielen Dank im Voraus und viele Grüße
    Peter

    J.HilkJ jsulmJ 2 Replies Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #2
      QTableWidgetItem *feld[64];
      for (zelle=0; xxx; zelle++)
      yyy->setItem(x,y,feld[zelle] = new QTableWidgetItem)
      

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      1 Reply Last reply
      0
      • P Offline
        P Offline
        peter_sailor
        wrote on last edited by
        #3

        Hallo VRonin,

        das funktioniert nicht. Der Compiler meldet folgendes:

        Fehler: no matching function for call to 'QTableWidget::setItem(<unresolved overloaded function type>, <unresolved overloaded function type>, QTableWidgetItem*&)'
        ui->schachbrett->setItem(x, y, feld[zelle]= new QTableWidgetItem)

        Grüße Peter
        ^

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by
          #4

          Was ist x und y?

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          1 Reply Last reply
          0
          • P peter_sailor

            Hallo liebe Forum-Mitglieder

            ich habe jetzt lange nach einer Lösungen gesucht, leider noch nichts gefunden.
            Ich möchte ein array von QWidgetItem's erstellen und initialiseren, so in der Form:

            QTableWidgetItem *feld[64];
            for (zelle=0; xxx; zelle++)
            yyy->setItem(x,y,feld[zelle])

            Hier stürzt das Programm ab. Offensichtlich mag die Funktion setItem kein Array.
            Ich habe dann das Problem so gelöst:

            QTableWidgetItem *feld[64];
            QTableWidgetItem *item0 = new QTableWidgetItem();
            yyy->setItem(7,0, item0);
            feld[zelle] = item0; // diese zuweisung funktioniert
            zelle++;

            Bei mehr als 50 Item's/Zellen ist das viel Handarbeit. Kennt jemand eine funktionierende bessere Lösung?

            Vielen Dank im Voraus und viele Grüße
            Peter

            J.HilkJ Offline
            J.HilkJ Offline
            J.Hilk
            Moderators
            wrote on last edited by J.Hilk
            #5

            @peter_sailor
            Hey ho,

            Frage, weil es von deinem Code-Schnipsel nicht klar wird, wie wird deine Abbruchbedingung gesetzt?
            Weil nur diese 3 Zeilen muss zwangsweise dazu führen dass Zelle größer ist als 64

            QTableWidgetItem *feld[64];
            for (zelle=0; xxx; zelle++)
            yyy->setItem(x,y,feld[zelle])


            Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


            Q: What's that?
            A: It's blue light.
            Q: What does it do?
            A: It turns blue.

            1 Reply Last reply
            1
            • P Offline
              P Offline
              peter_sailor
              wrote on last edited by
              #6

              Hallo,

              eine QTableWidget besteht aus vielen Zellen= Items deren Position durch Reihe und Spalte , x und y , bestimmbar sind. So wird jedes einzelne Item mit setItem mit x,y ermittelt und mit eigenem Namen intitialisiert, siehe Funktions-Beschreibung setItem in der Klasse QTableWidgetItem.

              Mit QTableWidget kann man beliebige Tabellen z.B. mit dem Desginer erstellen. In diesem Fall besteht die Tabelle aus 64 Zellen/Felder/Item's (synonym verwendet) bestehen. Die Abbruchbedingung ist dann eigentlich klar, es dürfen nur die maximale Anzahl der Item's als Abbruch eingestellt werden, in dem Falle zelle<64.

              Das ziel ist es, mit dem Array feld[64] elegant auf Inhalte, Design etc. zuzugreifen.

              Viele Grüße
              Peter
              0_1521670033116_screenshot_chesspro_chessboard1.png

              1 Reply Last reply
              0
              • P peter_sailor

                Hallo liebe Forum-Mitglieder

                ich habe jetzt lange nach einer Lösungen gesucht, leider noch nichts gefunden.
                Ich möchte ein array von QWidgetItem's erstellen und initialiseren, so in der Form:

                QTableWidgetItem *feld[64];
                for (zelle=0; xxx; zelle++)
                yyy->setItem(x,y,feld[zelle])

                Hier stürzt das Programm ab. Offensichtlich mag die Funktion setItem kein Array.
                Ich habe dann das Problem so gelöst:

                QTableWidgetItem *feld[64];
                QTableWidgetItem *item0 = new QTableWidgetItem();
                yyy->setItem(7,0, item0);
                feld[zelle] = item0; // diese zuweisung funktioniert
                zelle++;

                Bei mehr als 50 Item's/Zellen ist das viel Handarbeit. Kennt jemand eine funktionierende bessere Lösung?

                Vielen Dank im Voraus und viele Grüße
                Peter

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

                @peter_sailor said in Ein array von QTableWidgetItem's initialisieren?:

                QTableWidgetItem *feld[64];
                for (zelle=0; xxx; zelle++)
                yyy->setItem(x,y,feld[zelle])

                Natürlich stürzt dein Program ab! Du hast feld nicht initialisiert und benutzt Pointers die auf nichts zeigen!

                QTableWidgetItem *feld[64];
                for (zelle=0; zelle < 64; ++zelle)
                    feld[zelle] = new QTableWidgetItem();
                // Jetzt kannst du yyy->setItem(x,y,feld[zelle]) benutzen
                

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

                1 Reply Last reply
                3
                • P Offline
                  P Offline
                  peter_sailor
                  wrote on last edited by
                  #8

                  Hallo jsulm,
                  dann kommt folgende Fehlermeldung:

                  Fehler: no matching function for call to 'QTableWidget::setItem(<unresolved overloaded function type>, <unresolved overloaded function type>, QTableWidgetItem*&)'
                  ui->schachbrett->setItem(x, y, feld[zelle]= new QTableWidgetItem)

                  Das hätte mich auch gewundert, wenn das funktioniert. Erstens, ich habe das aller Wahrscheinlichkeit nach gestestet. Zweitens werden mit
                  QTableWidgetItem *feld[64];
                  alle Elemente des Array deklariert, deshalb overlaoded.

                  Grüße
                  Peter

                                                                                       ^
                  
                  aha_1980A jsulmJ 2 Replies Last reply
                  0
                  • P peter_sailor

                    Hallo jsulm,
                    dann kommt folgende Fehlermeldung:

                    Fehler: no matching function for call to 'QTableWidget::setItem(<unresolved overloaded function type>, <unresolved overloaded function type>, QTableWidgetItem*&)'
                    ui->schachbrett->setItem(x, y, feld[zelle]= new QTableWidgetItem)

                    Das hätte mich auch gewundert, wenn das funktioniert. Erstens, ich habe das aller Wahrscheinlichkeit nach gestestet. Zweitens werden mit
                    QTableWidgetItem *feld[64];
                    alle Elemente des Array deklariert, deshalb overlaoded.

                    Grüße
                    Peter

                                                                                         ^
                    
                    aha_1980A Offline
                    aha_1980A Offline
                    aha_1980
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    Hallo @peter_sailor

                    Du hast bei deinem Ansatz ein Denkproblem. Du benötigst kein Array von QTableWidgetItem, da QTableWidget dies ja bereits ist.

                    Jedes von dir erstellte QTableWidgetItem wird bei Zuweisung mit setItem auch Bestandteil der Tabelle, d.h. QTableWidget gehört der Zeiger ab sofort, nicht mehr Dir!

                    Du hast jetzt zwei Möglichkeiten:

                    1. Du bleibst bei QTableWidget und verstehst, dass dieses dein Array automatisch beinhaltet, oder
                    2. Du verwendest QTableView mit einem eigenen Modell, was wahrscheinlich der sauberere Ansatz ist. Hier ist QTableView wirklich nur die Darstellung des Schachbretts, welches Du im Hintergrund verwaltest.

                    Grüße

                    Qt has to stay free or it will die.

                    1 Reply Last reply
                    1
                    • P Offline
                      P Offline
                      peter_sailor
                      wrote on last edited by
                      #10

                      Hallo aha_1980,

                      danke, das ist o.k.

                      Wie oben schon geschrieben, habe ich eine Lösung:

                      QTableWidgetItem *feld[64];
                      yyy->setItem(7,0, item0);
                      feld[zelle] = item0; // diese zuweisung funktioniert

                      Über diesen Weg habe ich mein Array und kann über Zellen-Nummer auf jedes item der Table zugreifen. Ich suchte nach einer komfortablen Lösung ohne 64 Items zu initialisieren, wegen Handarbeit.

                      Grüße
                      Peter

                      J.HilkJ 1 Reply Last reply
                      0
                      • VRoninV Offline
                        VRoninV Offline
                        VRonin
                        wrote on last edited by VRonin
                        #11

                        Probably OT and in English

                        Another users asked something similar in the italian section, we worked a while on it and the result is: https://github.com/VSRonin/EsempioScacchi

                        Edit: Fixed wrong link

                        "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
                        ~Napoleon Bonaparte

                        On a crusade to banish setIndexWidget() from the holy land of Qt

                        1 Reply Last reply
                        1
                        • P peter_sailor

                          Hallo aha_1980,

                          danke, das ist o.k.

                          Wie oben schon geschrieben, habe ich eine Lösung:

                          QTableWidgetItem *feld[64];
                          yyy->setItem(7,0, item0);
                          feld[zelle] = item0; // diese zuweisung funktioniert

                          Über diesen Weg habe ich mein Array und kann über Zellen-Nummer auf jedes item der Table zugreifen. Ich suchte nach einer komfortablen Lösung ohne 64 Items zu initialisieren, wegen Handarbeit.

                          Grüße
                          Peter

                          J.HilkJ Offline
                          J.HilkJ Offline
                          J.Hilk
                          Moderators
                          wrote on last edited by
                          #12

                          @peter_sailor
                          Ich versteh Immernoch nicht ganz das Problem, du solltest einmal den ganzen Funktionsblock posten.

                          Das gesagt, was mit der Lösung hier:

                          int zelle (0);
                          QTableWidgetItem *feld[64];
                          for(int i(0); i<8;i++){
                              for(int j(0); j<8;j++){
                                  feld[zelle] = new QTableWidgetItem();
                                  yyy->setItem(i,j,feld[zelle]);
                                  zelle++;
                              }
                          }
                          

                          Be aware of the Qt Code of Conduct, when posting : https://forum.qt.io/topic/113070/qt-code-of-conduct


                          Q: What's that?
                          A: It's blue light.
                          Q: What does it do?
                          A: It turns blue.

                          1 Reply Last reply
                          1
                          • P Offline
                            P Offline
                            peter_sailor
                            wrote on last edited by
                            #13

                            Hallo an Alle,

                            die aktuelle Lösung sieht so aus:

                            QTableWidgetItem *feld[64] ;
                            QTableWidgetItem *item0 = new QTableWidgetItem();
                            ui->schachbrett->setItem(7,0, item0);
                            feld[zelle] = item0;
                            QTableWidgetItem *item1 = new QTableWidgetItem();
                            ui->schachbrett->setItem(7,1, item1);
                            feld[++zelle] = item1;
                            QTableWidgetItem *item2 = new QTableWidgetItem();
                            ui->schachbrett->setItem(7,2, item2);
                            feld[++zelle] = item2;
                            QTableWidgetItem *item3 = new QTableWidgetItem();
                            ui->schachbrett->setItem(7,3, item3);
                            feld[++zelle] = item3;
                            XXXXXXXXXXXXXXXXX insgemast 64 mal das Gleiche, also
                            item1 bis item64. Also erst die item's initialisert und diese dann einzelne dem Array feld[zelle] zuweisen.
                            Das wollte ich vermeiden und mit einer for-Schleife lösen. Das geht nicht, weil ui->schachbrett->setItem(7,0, feld[zelle]); nicht geht.
                            Irgendwo muss ich ein Array aufbauen, damit per Index auf die Zellen zugreifen. Sonst macht das Folgeprogramm keinen Sinn.

                            Ich betrachte das Thema als gelöst, auch wenn es umständlich ist.

                            Danke und viele Grüße
                            Peter

                            1 Reply Last reply
                            0
                            • aha_1980A Offline
                              aha_1980A Offline
                              aha_1980
                              Lifetime Qt Champion
                              wrote on last edited by aha_1980
                              #14

                              @peter_sailor

                              Wozu stellst Du eine Frage im Forum, wenn Du dann alle Antworten verwirfst und auf unnötig komplizierte Art arbeitest?

                              Lies bitte noch einmal meinen Beitrag und versuche ihn zu verstehen!

                              Eine mögliche Lösung sieht z.B. so aus:

                              	enum { size = 8 };
                              	ui->table->setRowCount(size);
                              	ui->table->setColumnCount(size);
                              	for (int row = 0; row < size; ++row) {
                              		for (int column = 0; column < size; ++column) {
                              			QTableWidgetItem *item = new QTableWidgetItem;
                              			item->setText(tr("%1%2").arg(char(row + 'A')).arg(column + 1));
                              			ui->table->setItem(row, column, item);
                              		}
                              	}
                              

                              Das Resultat sieht so aus: https://ibb.co/jD5cnx

                              Grüße

                              Qt has to stay free or it will die.

                              1 Reply Last reply
                              2
                              • P peter_sailor

                                Hallo jsulm,
                                dann kommt folgende Fehlermeldung:

                                Fehler: no matching function for call to 'QTableWidget::setItem(<unresolved overloaded function type>, <unresolved overloaded function type>, QTableWidgetItem*&)'
                                ui->schachbrett->setItem(x, y, feld[zelle]= new QTableWidgetItem)

                                Das hätte mich auch gewundert, wenn das funktioniert. Erstens, ich habe das aller Wahrscheinlichkeit nach gestestet. Zweitens werden mit
                                QTableWidgetItem *feld[64];
                                alle Elemente des Array deklariert, deshalb overlaoded.

                                Grüße
                                Peter

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

                                @peter_sailor said in Ein array von QTableWidgetItem's initialisieren?:

                                ui->schachbrett->setItem(x, y, feld[zelle]= new QTableWidgetItem)

                                Wieso ist hier immer noch

                                feld[zelle]= new QTableWidgetItem
                                

                                ?!
                                Du hast doch jetzt schon das Array initialisiert.
                                Das reicht jetzt vollkommen:

                                ui->schachbrett->setItem(x, y, feld[zelle]);
                                

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

                                1 Reply Last reply
                                0
                                • P Offline
                                  P Offline
                                  peter_sailor
                                  wrote on last edited by
                                  #16

                                  Hallo an Alle, so sieht die Ergebnis aus.
                                  0_1521830724618_xy.JPG

                                  für aha_1980:
                                  Was Du mit Deinem letzten Post schreibst, geht o.k. und habe ich auch probiert.
                                  Mein Ziel ist es ,die item's nicht mit row und column anzusprechen, sondern mit einem Index 0 bis 63 (feld[64]). Dabei ist der Index genau ien Feld auf dem Schachbrett. Das ist wichtig für die nachfolgenden Progammierung, z.B. ein Bauer zieht dann von feld 11 nach feld 19 (also Index 11 + 8 oder Index 11 + 16 ). Das ist einfacher und eleganter als row und column zu rechnen. Des weiteren steht auf einem feld 11 ein Bauer oder auf Feld 0 ein Turm. O.K.?

                                  für jsulm:
                                  ui->schachbrett->setItem(x, y, feld[zelle]); Hast Du das mal getestet? Bei mir läuft es nicht. siehe weiter oben.

                                  Viele Grüße
                                  Peter

                                  1 Reply Last reply
                                  0

                                  • Login

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