Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Creating a matrix of QLabels
Forum Updated to NodeBB v4.3 + New Features

Creating a matrix of QLabels

Scheduled Pinned Locked Moved Solved General and Desktop
19 Posts 7 Posters 11.4k Views 3 Watching
  • 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.
  • podsvirovP Offline
    podsvirovP Offline
    podsvirov
    wrote on last edited by
    #6

    I do not understand.
    You need programmatic access in the form of a matrix or a special presentation of data in a graphical interface?

    1 Reply Last reply
    0
    • H Offline
      H Offline
      holygirl
      wrote on last edited by
      #7

      Both! In the GUI, I want the labels to be displayed as:

      @
      label1 label2 label3
      label4 label5 label6
      label7 label8 label9
      @

      and programmatically I wish to access these labels using their respective indices.

      1 Reply Last reply
      0
      • Q Offline
        Q Offline
        qxoz
        wrote on last edited by
        #8

        What about QMap<QString, QLabel *> ?
        and access like labelMap["label1"]->setText("label1");

        1 Reply Last reply
        0
        • podsvirovP Offline
          podsvirovP Offline
          podsvirov
          wrote on last edited by
          #9

          It may suit:

          @
          #include <QApplication>
          #include <QGridLayout>
          #include <QLabel>

          class QGridLabelMatrix
          {
          public:
          QGridLabelMatrix(const QGridLayout *grid) :
          g(grid)
          {
          Q_ASSERT(grid != 0);
          }

          QLabel* label(int row, int column) const
          {
              return qobject_cast<QLabel*>(g->itemAtPosition(row, column)->widget());
          }
          

          private:
          const QGridLayout *g;
          };

          int main(int argc, char *argv[])
          {
          int rows = 3, columns = 3;

          QApplication a(argc, argv);
          
          QGridLayout *grid = new QGridLayout();
          
          for(int i = 0; i < rows; i++) {
              for(int j = 0; j < columns; j++) {
                  QLabel *label = new QLabel(QString("label %1")
                                             .arg(i * columns + j + 1));
                  grid->addWidget(label, i, j);
              }
          }
          
          // grid:
          // label1    label2    label3
          // label4    label5    label6
          // label7    label8    label9
          
          QGridLabelMatrix matrix(grid);
          matrix.label(0, 0)->setText("first");
          matrix.label(0, 2)->setText("right");
          matrix.label(2, 2)->setText("last");
          
          // now grid:
          // first     label2    right
          // label4    label5    label6
          // label7    label8    last
          
          QWidget w;
          w.setLayout(grid);
          w.show();
          
          return a.exec&#40;&#41;;
          

          }
          @

          1 Reply Last reply
          0
          • H Offline
            H Offline
            holygirl
            wrote on last edited by
            #10

            [quote author="holygirl" date="1367224774"]
            Konstantin

            Thank you so much for your reply. I've tried using QTableWidget and QTableView before but I want to use QLabel only because the width of each cell varies in the grid.
            [/quote]

            Hi again!

             As I mentioned above, each cell varies in its width. So I cannot use a _GridLayout_ either. Let me give you a pictorial idea of how my labels will look after populating it with data.
            

            @

            | Label1 | Label2 | Label3 | Label4 |

            | Label5 | Label6 | Label7 | Label8 |

            | Label9 | Label10 | Label11 | Label12 |

            @

            So I not only have to generate these labels on the GUI, but also access them using indices so I can manipulate their properties like

            @
            label [0][2]->setText("Changed label");
            @

            Thanks for your replies guys!

            P.S. - qxoz, I haven't looked into what you suggested. I will keep you posted on whether it works for me. Thanks very much :)

            1 Reply Last reply
            0
            • podsvirovP Offline
              podsvirovP Offline
              podsvirov
              wrote on last edited by
              #11

              Hi again!

              This will be the matrix? The number of elements in each row should be the same?
              Or depending on the width of the labels their number may vary?

              For example:

              @

              | Label 1 | Long label 2 | Very loooooooooooooooong label 3 |

              | Label 4 | Label 5 | Label 6 | Label 7 |

              | BIG LABEL 8 |

              @

              1 Reply Last reply
              0
              • H Offline
                H Offline
                holygirl
                wrote on last edited by
                #12

                Yes! The number may vary. Exactly like how you've depicted it. I found a solution after days and days of googling and reading books. Ha ha! Here it is:

                @
                QVector<QVector<QLabel *> > vectorOfVectorsOfLabels;
                @

                @
                for(int i=0;i<num_of_rows;i++) {
                QVector<QLabel > foo; //QVector of QLabels
                for(int i=0;i<row.length();i++) {
                QLabel
                label = new QLabel(this);
                //Do whatever with label
                foo.append(label);
                }
                vectorOfVectorsOfLabels.append(foo);
                }
                @

                and the labels can be accessed as:

                @
                for(int i = 0; i < vectorOfVectorsOfLabels.size(); i++) {
                for(int j = 0; j < vectorOfVectorsOfLabels [i].size(); j++) {
                vectorOfVectorsOfLabels [0][1]->setText("Changed label");
                // or do anything with the QLabel vectorOfVectorsOfLabels [i][j]
                }
                }
                @

                Anyway, I thank all of you for your constant support and help! I'm marking the thread solved. Thanks people! :)

                1 Reply Last reply
                0
                • B Offline
                  B Offline
                  b1gsnak3
                  wrote on last edited by
                  #13

                  QList<QList<QLabel *>> :) if the size varies... or store the number of labels / row when you add them "dynamically"

                  1 Reply Last reply
                  0
                  • H Offline
                    H Offline
                    holygirl
                    wrote on last edited by
                    #14

                    Thanks for the tip! :)

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      Asid
                      wrote on last edited by
                      #15

                      how can i add layouts in this label matrix?

                      VRoninV 1 Reply Last reply
                      0
                      • A Asid

                        how can i add layouts in this label matrix?

                        VRoninV Offline
                        VRoninV Offline
                        VRonin
                        wrote on last edited by
                        #16

                        QGridLayout has an addLayout() method for that

                        "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
                        • A Offline
                          A Offline
                          Asid
                          wrote on last edited by
                          #17

                          thank you very much

                          A 1 Reply Last reply
                          0
                          • A Asid

                            thank you very much

                            A Offline
                            A Offline
                            Asid
                            wrote on last edited by
                            #18

                            @Asid i am trying but is not get a resoult

                            1 Reply Last reply
                            0
                            • ? Offline
                              ? Offline
                              A Former User
                              wrote on last edited by
                              #19

                              Hi! Here's a minimal example:

                              #include <QApplication>
                              #include <QWidget>
                              #include <QGridLayout>
                              #include <QVBoxLayout>
                              #include <QLabel>
                              
                              int main(int argc, char *argv[])
                              {
                                  QApplication a(argc, argv);
                                  QWidget mainWindow;
                                  auto gridLayout = new QGridLayout(&mainWindow);
                                  for (int row = 0; row < 3; ++row) {
                                      for (int column = 0; column < 3; ++column) {
                                          if (row == 1 && column == 1) {
                                              auto innerLayout = new QVBoxLayout;
                                              gridLayout->addLayout(innerLayout, 1, 1);
                                              for (int i = 0; i < 3; ++i) {
                                                  auto label = new QLabel(&mainWindow);
                                                  innerLayout->addWidget(label);
                                                  label->setText(QString::number(i));
                                              }
                                          } else {
                                              auto label = new QLabel(&mainWindow);
                                              gridLayout->addWidget(label, row, column);
                                              label->setText( QString("%1,%2").arg(row).arg(column) );
                                          }
                                      }
                                  }
                                  mainWindow.show();
                                  return a.exec();
                              }
                              
                              1 Reply Last reply
                              2

                              • Login

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