Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. 3rd Party Software
  4. Visual Studio Qt tools - signal/slot mechanism?
Forum Updated to NodeBB v4.3 + New Features

Visual Studio Qt tools - signal/slot mechanism?

Scheduled Pinned Locked Moved Unsolved 3rd Party Software
5 Posts 3 Posters 4.9k 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.
  • J Offline
    J Offline
    jindraSindelar
    wrote on last edited by
    #1

    Hello all,

    I would like to kindly ask for help with Qt Tools for VS2015. My setup is:
    VS Pro 2015, Version 14.0.25431.01 (update 3), Qt 5.12.1, Qt VS Tools v2.3.2, VS remote debugger 2015, deployment via {path_to_qt}/5.12.1/msvc2017_64/bin/windeployqt.exe

    I choosed the Qt extension for VS since I wasn't able to run remote debug (Win10 <-> Win10) with Qt Creator. After some fiddling around with the Qt VS Tools, the remote debug seems to work for me. However, I haven't found a way how to connect a signal comming from a GUI element to a defined slot function - the Qt creator has a few-click-solution for that, but there's no "Go to slot" option in the Qt designer in VS.

    I have found following link mentioning the naming convention for user-defined slot functions:
    https://stackoverflow.com/revisions/43918538/2

    Say I have a push button called pushButton and I want to trigger an event on its release. So in the main .cpp file (the one that calls

    ui.setupUi(this);
    

    I have implemented following:

    void on_pushButton_released(void)
    {
        //... slot handling code here
    }
    

    What seemed to be fine was that the compiler was not complaining about missing prototype of that function (I haven't declared it in the header), so I was expecting that some "background magic" handles that. But no matter what, when I press and release the pushButton while debugging, this function is not called. Declaring its prototype in the header doesn't help. Also, when I have grep-ed through all the project files, I haven't found any more references to that function...

    Can anybody please explain how this shall be done, considering my setup?

    Many thanks in advance
    Jindra Sindelar

    JonBJ JKSHJ 2 Replies Last reply
    0
    • J jindraSindelar

      Hello all,

      I would like to kindly ask for help with Qt Tools for VS2015. My setup is:
      VS Pro 2015, Version 14.0.25431.01 (update 3), Qt 5.12.1, Qt VS Tools v2.3.2, VS remote debugger 2015, deployment via {path_to_qt}/5.12.1/msvc2017_64/bin/windeployqt.exe

      I choosed the Qt extension for VS since I wasn't able to run remote debug (Win10 <-> Win10) with Qt Creator. After some fiddling around with the Qt VS Tools, the remote debug seems to work for me. However, I haven't found a way how to connect a signal comming from a GUI element to a defined slot function - the Qt creator has a few-click-solution for that, but there's no "Go to slot" option in the Qt designer in VS.

      I have found following link mentioning the naming convention for user-defined slot functions:
      https://stackoverflow.com/revisions/43918538/2

      Say I have a push button called pushButton and I want to trigger an event on its release. So in the main .cpp file (the one that calls

      ui.setupUi(this);
      

      I have implemented following:

      void on_pushButton_released(void)
      {
          //... slot handling code here
      }
      

      What seemed to be fine was that the compiler was not complaining about missing prototype of that function (I haven't declared it in the header), so I was expecting that some "background magic" handles that. But no matter what, when I press and release the pushButton while debugging, this function is not called. Declaring its prototype in the header doesn't help. Also, when I have grep-ed through all the project files, I haven't found any more references to that function...

      Can anybody please explain how this shall be done, considering my setup?

      Many thanks in advance
      Jindra Sindelar

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

      @jindraSindelar
      I'm not a C++ expert, but I don't think you have to declare a function in a header file just because it exists in the .cpp, and you're not calling it anyway. So I don't think you'll get warnings if you've misspelt the proposed slot.

      You won't see any exact source references to on_pushButton_released because that will get generated via QMetaObject::connectSlotsByName().

      I can see that if you don't get it quite right your proposed slot won't get connected to signal.

      I think you should show the exact (relevant) source you are trying (including spelling of variable, what class it and your slot are inside), e.g. did you do the slots bit of:

      private slots:
          void on_pushButton_released();
      
      1 Reply Last reply
      0
      • J jindraSindelar

        Hello all,

        I would like to kindly ask for help with Qt Tools for VS2015. My setup is:
        VS Pro 2015, Version 14.0.25431.01 (update 3), Qt 5.12.1, Qt VS Tools v2.3.2, VS remote debugger 2015, deployment via {path_to_qt}/5.12.1/msvc2017_64/bin/windeployqt.exe

        I choosed the Qt extension for VS since I wasn't able to run remote debug (Win10 <-> Win10) with Qt Creator. After some fiddling around with the Qt VS Tools, the remote debug seems to work for me. However, I haven't found a way how to connect a signal comming from a GUI element to a defined slot function - the Qt creator has a few-click-solution for that, but there's no "Go to slot" option in the Qt designer in VS.

        I have found following link mentioning the naming convention for user-defined slot functions:
        https://stackoverflow.com/revisions/43918538/2

        Say I have a push button called pushButton and I want to trigger an event on its release. So in the main .cpp file (the one that calls

        ui.setupUi(this);
        

        I have implemented following:

        void on_pushButton_released(void)
        {
            //... slot handling code here
        }
        

        What seemed to be fine was that the compiler was not complaining about missing prototype of that function (I haven't declared it in the header), so I was expecting that some "background magic" handles that. But no matter what, when I press and release the pushButton while debugging, this function is not called. Declaring its prototype in the header doesn't help. Also, when I have grep-ed through all the project files, I haven't found any more references to that function...

        Can anybody please explain how this shall be done, considering my setup?

        Many thanks in advance
        Jindra Sindelar

        JKSHJ Offline
        JKSHJ Offline
        JKSH
        Moderators
        wrote on last edited by
        #3

        @jindraSindelar May I suggest writing the code explicitly? This makes your code easier to follow.

        class MyWidget : public QWidget {
            Q_OBJECT
        
        public slots:
            void mySlot() {
                //... slot handling code here
            }
        
            ...
        };
        
        MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
            ui->setupUi(this);
            connect(ui->pushButton, &QPushButton::released,
                    this, &MyClass::mySlot);
            ...
        }
        

        Or, if you don't need the slot to be called from anywhere else, then you don't even need a separate function. Just write your slot handling code in a lambda expression:

        MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
            ui->setupUi(this);
            connect(ui->pushButton, [=]() {
                //... slot handling code here
            });
            ...
        }
        

        Qt Doc Search for browsers: forum.qt.io/topic/35616/web-browser-extension-for-improved-doc-searches

        J 1 Reply Last reply
        1
        • JKSHJ JKSH

          @jindraSindelar May I suggest writing the code explicitly? This makes your code easier to follow.

          class MyWidget : public QWidget {
              Q_OBJECT
          
          public slots:
              void mySlot() {
                  //... slot handling code here
              }
          
              ...
          };
          
          MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
              ui->setupUi(this);
              connect(ui->pushButton, &QPushButton::released,
                      this, &MyClass::mySlot);
              ...
          }
          

          Or, if you don't need the slot to be called from anywhere else, then you don't even need a separate function. Just write your slot handling code in a lambda expression:

          MyWidget::MyWidget(QWidget *parent) : QWidget(parent) {
              ui->setupUi(this);
              connect(ui->pushButton, [=]() {
                  //... slot handling code here
              });
              ...
          }
          
          J Offline
          J Offline
          jindraSindelar
          wrote on last edited by
          #4

          Hello gents,

          thank you for your inputs, I'm now stuck a bit on a more urgent project, but I will definitelly take your advices and hopefully make it running :)

          Best regards
          Jindra

          1 Reply Last reply
          0
          • J Offline
            J Offline
            jindraSindelar
            wrote on last edited by
            #5

            Okay, I got it running thanks to your help, I'll post my solution for the case anybody will run into similar issues:

            "main.h":

            #include <QtWidgets/QWidget>
            #include "ui_HwMonTool_app.h"
            #include "PresentLogic.h"
            
            class HwMonTool_app : public QWidget
            {
                Q_OBJECT
            
            public:
                HwMonTool_app(QWidget *parent = Q_NULLPTR);
            
            private:
                Ui::HwMonTool_appClass ui;
                CPresentLogic logic;
            };
            

            "main.cpp":

            #include "HwMonTool_app.h"
            
            HwMonTool_app::HwMonTool_app(QWidget *parent)
                : QWidget(parent)
            {
                ui.setupUi(this);
            
                // when adding more signal-slot connections, follow this syntax:
                connect(ui.pushButton, &QPushButton::released, &(this->logic), &CPresentLogic::buttonPressed);
            }
            

            "PresentationLogic.h":

            #include "qobject.h"
            
            class CPresentLogic : public QObject
            {
                Q_OBJECT
            
            public:
                CPresentLogic() {};
                ~CPresentLogic() {};
            
            public slots:
                void buttonPressed(void)
                {
                    // put breakpoint here
                    while (0);
                }
            };
            

            When running this code in debugger and pressing (releasing) the pushButton, the buttonPressed() slot is called.

            Thanks again for all the help, this topic can now be locked :)

            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