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. Dynamically created buttons and connecting signal to slot

Dynamically created buttons and connecting signal to slot

Scheduled Pinned Locked Moved Solved General and Desktop
13 Posts 4 Posters 2.7k Views 1 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.
  • JonBJ 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 Offline
    K Offline
    Kris Revi
    wrote on last edited by
    #3

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

    btw i'll switch to the new connect()

    JonBJ 1 Reply Last reply
    0
    • K Kris Revi

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

      btw i'll switch to the new connect()

      JonBJ Offline
      JonBJ Offline
      JonB
      wrote on last edited by
      #4

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

      K 1 Reply Last reply
      0
      • JonBJ JonB

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

        K Offline
        K Offline
        Kris Revi
        wrote on last edited by
        #5

        @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

        JonBJ Christian EhrlicherC 2 Replies Last reply
        0
        • K Kris Revi

          @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

          JonBJ Offline
          JonBJ Offline
          JonB
          wrote on last edited by JonB
          #6

          @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
          1
          • JonBJ 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 Offline
            K Offline
            Kris Revi
            wrote on last edited by
            #7

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

            1 Reply Last reply
            0
            • JonBJ 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 Offline
              K Offline
              Kris Revi
              wrote on last edited by
              #8

              @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
              1
              • K Kris Revi

                @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

                Christian EhrlicherC Offline
                Christian EhrlicherC Offline
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #9

                @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
                4
                • Christian EhrlicherC Christian Ehrlicher

                  @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.

                  K Offline
                  K Offline
                  Kris Revi
                  wrote on last edited by
                  #10

                  @Christian-Ehrlicher leak? stack what now?

                  JonBJ 1 Reply Last reply
                  0
                  • K Kris Revi

                    @Christian-Ehrlicher leak? stack what now?

                    JonBJ Offline
                    JonBJ Offline
                    JonB
                    wrote on last edited by JonB
                    #11

                    @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
                    2
                    • JonBJ 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 Offline
                      K Offline
                      Kris Revi
                      wrote on last edited by
                      #12

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

                      mrjjM 1 Reply Last reply
                      0
                      • K Kris Revi

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

                        mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #13

                        @Kris-Revi
                        Yes exactly.

                        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