Qt Forum

    • Login
    • Search
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Unsolved

    Solved Dynamically created buttons and connecting signal to slot

    General and Desktop
    4
    13
    1118
    Loading More Posts
    • 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
      Kris Revi last edited by

      So i thought i was done with this! but then i forgot to connect button click to a slot!

      void MainWindow::updateImageFolder()
      {
          //assume the directory exists and contains some files grab every image file there
          QDir directory("./Matrix Images/32 x 32/");
          QStringList images = directory.entryList(QStringList() << "*.*" << "*.*",QDir::Files);
      
          QLayoutItem *child;
          while ((child = ui->GRID_IMAGEFOLDER_DISPLAY->takeAt(0)) != nullptr) {
              delete child->widget(); // delete the widget
              delete child;   // delete the layout item
          }
      
          signalMapper = new QSignalMapper(this);
      
          foreach(QString filename, images) {
      
              QPushButton *button = new QPushButton(this);
      
      
              connect(button, SIGNAL(clicked()), this, SLOT(selectedImageDisplay(filename)));
      
              button->setMinimumSize(32, 32);
              button->setMaximumSize(32, 32);
              button->setFixedSize(32, 32);
              button->setIcon(QIcon("./Matrix Images/32 x 32/" + filename));
              button->setIconSize(QSize(32, 32));
              button->setCursor(Qt::PointingHandCursor);
              button->setObjectName(filename);
      
              ui->GRID_IMAGEFOLDER_DISPLAY->addWidget(button);
      
          }
      }
      

      but i get this error

      QObject::connect: No such slot MainWindow::selectedImageDisplay(filename) in ..\NEONCONTROLLER\mainwindow.cpp:333
      QObject::connect:  (receiver name: 'MainWindow')
      

      and yes i have added void selectedImageDisplay(QString img); to mainwindow.h so :S

      JonB 1 Reply Last reply Reply Quote 0
      • JonB
        JonB @Kris Revi last edited by JonB

        @Kris-Revi said in Dynamically created buttons and connecting signal to slot:

        connect(button, SIGNAL(clicked()), this, SLOT(selectedImageDisplay(filename)));

        To the best of my knowledge you need the parameter type not name in these macros?
        connect(button, SIGNAL(clicked()), this, SLOT(selectedImageDisplay(QString)));

        However, if you would please move over to the new style signal/slot syntax instead of these macros your QoL (& ours) would be better!

        Even when you have done that, you will find you can't do it like you're trying. You are going to need to use a C++ lambda here for the slot so as to pass the filename parameter from the local variable, because the clicked() signal does not pass such a string. Start from e.g.
        https://forum.qt.io/topic/96163/lambda-that-uses-signal-argument-to-connect-to-a-slot
        https://artandlogic.com/2013/09/qt-5-and-c11-lambdas-are-your-friend/amp/
        https://medium.com/genymobile/how-c-lambda-expressions-can-improve-your-qt-code-8cd524f4ed9f

        K 1 Reply Last reply Reply Quote 2
        • K
          Kris Revi @JonB last edited by

          @JonB ooh noo... lambda in C++ is a pain compared to python version :|

          btw i'll switch to the new connect()

          JonB 1 Reply Last reply Reply Quote 0
          • JonB
            JonB @Kris Revi last edited by

            @Kris-Revi
            I have just appended some reference links for the lambda stuff to my previous post.

            K 1 Reply Last reply Reply Quote 0
            • K
              Kris Revi @JonB last edited by

              @JonB so i got it working

              connect(button, &QPushButton::clicked, [=]() { selectedImageDisplay("./Matrix Images/32 x 32/" + filename); });
              

              having 1 problem tho

              void MainWindow::selectedImageDisplay(QString img)
              {
                  imageObject = new QImage();           // Make a new imageObject
                  imageObject->load(img);          // Load the image from path
              
                  QJsonArray RGB565;
                  for(int y = 0; y < imageObject->height(); y++) {
                      const quint16 *line = reinterpret_cast<const quint16*>(imageObject->constScanLine(y));
                      for(int x = 0; x < imageObject->width(); x++)
                          RGB565 << *(line++);
                  }
              
                  socket.sendCommandStrip(QString("pixArt"), RGB565);
              }
              

              when it gets sent to the Matrix the pixels are out of order and the colors are way off for some reason :S can you spot why? cause i cant :S

              JonB Christian Ehrlicher 2 Replies Last reply Reply Quote 0
              • JonB
                JonB @Kris Revi last edited by JonB

                @Kris-Revi
                I believe you got that loop-packing code from @Bonnie in another thread, so he can come and sort it out ;-)

                While you wait for him/inspiration, do some debugging yourself: look at the first so-many byte values sent, compare against the values of those received, is there a difference-pattern? Do you even end up with same number received as sent? Your problem might be in retrieving them, packing/unpacking them, or JSONifying them.

                [P.S. You had a QSignalMapper earlier: if you're going to go down lambda route (much more powerful) you can probably get rid of that.]

                K 2 Replies Last reply Reply Quote 1
                • K
                  Kris Revi @JonB last edited by

                  @JonB that's true! i googled and got som sugestion for my problem but yea! :) removed now!

                  1 Reply Last reply Reply Quote 0
                  • K
                    Kris Revi @JonB last edited by

                    @JonB i fixed it! so i mentioned that the colors was off and pixel order so i thought why not just try

                    *imageObject = imageObject->convertToFormat(QImage::Format_RGB16);
                    

                    and that was the problem :) even if i saved the image as RGB16 upen uploading it and converting it it was not saved as RGB16 apparently

                    1 Reply Last reply Reply Quote 1
                    • Christian Ehrlicher
                      Christian Ehrlicher Lifetime Qt Champion @Kris Revi last edited by

                      @Kris-Revi said in Dynamically created buttons and connecting signal to slot:

                      imageObject = new QImage();

                      You leak this image object. Better create it on the stack.

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      K 1 Reply Last reply Reply Quote 4
                      • K
                        Kris Revi @Christian Ehrlicher last edited by

                        @Christian-Ehrlicher leak? stack what now?

                        JonB 1 Reply Last reply Reply Quote 0
                        • JonB
                          JonB @Kris Revi last edited by JonB

                          @Kris-Revi
                          "leak" means the memory used by your new QImage() is never returned to the pool. Either delete it at the end, or @Christian-Ehrlicher is suggesting easiest is make it a QImage imageObject; variable here, which means it is on the "stack" (instead of the "heap" for newed objects). Then it gets thrown away at end of the method for sure.

                          K 1 Reply Last reply Reply Quote 2
                          • K
                            Kris Revi @JonB last edited by

                            @JonB so make a QImage imageObject; not imageObject = new QImage() ?,

                            mrjj 1 Reply Last reply Reply Quote 0
                            • mrjj
                              mrjj Lifetime Qt Champion @Kris Revi last edited by

                              @Kris-Revi
                              Yes exactly.

                              1 Reply Last reply Reply Quote 0
                              • First post
                                Last post