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. Connecting to slot by string name
Forum Updated to NodeBB v4.3 + New Features

Connecting to slot by string name

Scheduled Pinned Locked Moved Solved General and Desktop
18 Posts 7 Posters 6.9k 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.
  • P Offline
    P Offline
    poor_robert
    wrote on last edited by
    #1

    Hello I have following code:

    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
    	Q_OBJECT
    
    public:
    	explicit MainWindow(QWidget *parent = 0);
    	~MainWindow();
    
    signals:
    	void testSignal();
    
    public slots:
    	void testSlot();
    
    private:
    	Ui::MainWindow *ui;
    };
    
    MainWindow::MainWindow(QWidget *parent) :
    	QMainWindow(parent),
    	ui(new Ui::MainWindow)
    {
    	ui->setupUi(this);
    
    	bool result = false;
    	result = connect(this, SIGNAL(testSignal()), this, SLOT("testSlot()"));
    	qDebug() << result;
    }
    
    MainWindow::~MainWindow()
    {
    	delete ui;
    }
    
    void MainWindow::testSlot()
    {
    
    }
    
    

    but when I ran it I get:

    QObject::connect: No such slot MainWindow::"testSlot()" in ../connections/MainWindow.cpp:14
    QObject::connect: (sender name: 'MainWindow')
    QObject::connect: (receiver name: 'MainWindow')
    false

    Can you tell me how to properly connect to the slot by its string name? I know hot to use signal and slots but I have no idea how to force it work with the slot name passed by name.

    BR,
    poorBob

    m.sueM 1 Reply Last reply
    0
    • P poor_robert

      Hello I have following code:

      namespace Ui {
      class MainWindow;
      }
      
      class MainWindow : public QMainWindow
      {
      	Q_OBJECT
      
      public:
      	explicit MainWindow(QWidget *parent = 0);
      	~MainWindow();
      
      signals:
      	void testSignal();
      
      public slots:
      	void testSlot();
      
      private:
      	Ui::MainWindow *ui;
      };
      
      MainWindow::MainWindow(QWidget *parent) :
      	QMainWindow(parent),
      	ui(new Ui::MainWindow)
      {
      	ui->setupUi(this);
      
      	bool result = false;
      	result = connect(this, SIGNAL(testSignal()), this, SLOT("testSlot()"));
      	qDebug() << result;
      }
      
      MainWindow::~MainWindow()
      {
      	delete ui;
      }
      
      void MainWindow::testSlot()
      {
      
      }
      
      

      but when I ran it I get:

      QObject::connect: No such slot MainWindow::"testSlot()" in ../connections/MainWindow.cpp:14
      QObject::connect: (sender name: 'MainWindow')
      QObject::connect: (receiver name: 'MainWindow')
      false

      Can you tell me how to properly connect to the slot by its string name? I know hot to use signal and slots but I have no idea how to force it work with the slot name passed by name.

      BR,
      poorBob

      m.sueM Offline
      m.sueM Offline
      m.sue
      wrote on last edited by
      #2

      Hi @poor_robert

      The problem is the namespace you use. Remove it and it will work.

      -Michael.

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

        Hello @m-sue ,

        which namespace? MainWindow? How to remove it then?

        m.sueM 1 Reply Last reply
        0
        • artwawA Offline
          artwawA Offline
          artwaw
          wrote on last edited by
          #4

          @poor_robert said in Connecting to slot by string name:

          SLOT("testSlot()"));

          Should be SLOT(testSlot())); methinks.

          For more information please re-read.

          Kind Regards,
          Artur

          1 Reply Last reply
          5
          • P poor_robert

            Hello @m-sue ,

            which namespace? MainWindow? How to remove it then?

            m.sueM Offline
            m.sueM Offline
            m.sue
            wrote on last edited by
            #5

            Hi @poor_robert

            This one:

            namespace Ui {
            class MainWindow;
            }
            

            -Michael.

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

              @artwaw
              of course you're right, but in this case I want to know how to connect with slot name in parenthesis so SLOT("testSlot()")); is exactly what I want to try.

              @m-sue :
              I have simplified the code:

              class MainWindow : public QObject
              {
              	Q_OBJECT
              
              public:
              	explicit MainWindow(QObject *parent = 0);
              	~MainWindow();
              
              signals:
              	void testSignal();
              
              public slots:
              	void testSlot();
              };
              
              
              #include "MainWindow.h"
              
              #include <QDebug>
              
              MainWindow::MainWindow(QObject *parent)
              {
              	bool result = false;
              	result = connect(this, SIGNAL(testSignal()), this, SLOT("testSlot()"));
              	qDebug() << result;
              }
              
              MainWindow::~MainWindow()
              {
              }
              
              void MainWindow::testSlot()
              {
              
              }
              
              

              but I still receive:
              QObject::connect: No such slot MainWindow::"testSlot()" in ../connections/MainWindow.cpp:8
              false

              Do you have any ideas?

              artwawA jsulmJ 2 Replies Last reply
              0
              • Pradeep KumarP Offline
                Pradeep KumarP Offline
                Pradeep Kumar
                wrote on last edited by Pradeep Kumar
                #7

                Hi,

                @poor_robert , as told by @artwaw change the connect statement , u cannot
                provide the function name in quotes.

                Both signal and slot function signature has to match.

                Thanks,

                Pradeep Kumar
                Qt,QML Developer

                1 Reply Last reply
                0
                • Pradeep KumarP Offline
                  Pradeep KumarP Offline
                  Pradeep Kumar
                  wrote on last edited by
                  #8

                  result = connect(this, SIGNAL(testSignal()), this, SLOT(testSlot()));

                  replace the above line and check.

                  Thanks,

                  Pradeep Kumar
                  Qt,QML Developer

                  1 Reply Last reply
                  5
                  • P poor_robert

                    @artwaw
                    of course you're right, but in this case I want to know how to connect with slot name in parenthesis so SLOT("testSlot()")); is exactly what I want to try.

                    @m-sue :
                    I have simplified the code:

                    class MainWindow : public QObject
                    {
                    	Q_OBJECT
                    
                    public:
                    	explicit MainWindow(QObject *parent = 0);
                    	~MainWindow();
                    
                    signals:
                    	void testSignal();
                    
                    public slots:
                    	void testSlot();
                    };
                    
                    
                    #include "MainWindow.h"
                    
                    #include <QDebug>
                    
                    MainWindow::MainWindow(QObject *parent)
                    {
                    	bool result = false;
                    	result = connect(this, SIGNAL(testSignal()), this, SLOT("testSlot()"));
                    	qDebug() << result;
                    }
                    
                    MainWindow::~MainWindow()
                    {
                    }
                    
                    void MainWindow::testSlot()
                    {
                    
                    }
                    
                    

                    but I still receive:
                    QObject::connect: No such slot MainWindow::"testSlot()" in ../connections/MainWindow.cpp:8
                    false

                    Do you have any ideas?

                    artwawA Offline
                    artwawA Offline
                    artwaw
                    wrote on last edited by
                    #9

                    @poor_robert said in Connecting to slot by string name:

                    of course you're right, but in this case I want to know how to connect with slot name in parenthesis so SLOT("testSlot()")); is exactly what I want to try.

                    Of course I may be wrong and I would welcome an opinion from someone more advanced in the subject but according to my knowledge this will not work at all.

                    For more information please re-read.

                    Kind Regards,
                    Artur

                    1 Reply Last reply
                    1
                    • P poor_robert

                      @artwaw
                      of course you're right, but in this case I want to know how to connect with slot name in parenthesis so SLOT("testSlot()")); is exactly what I want to try.

                      @m-sue :
                      I have simplified the code:

                      class MainWindow : public QObject
                      {
                      	Q_OBJECT
                      
                      public:
                      	explicit MainWindow(QObject *parent = 0);
                      	~MainWindow();
                      
                      signals:
                      	void testSignal();
                      
                      public slots:
                      	void testSlot();
                      };
                      
                      
                      #include "MainWindow.h"
                      
                      #include <QDebug>
                      
                      MainWindow::MainWindow(QObject *parent)
                      {
                      	bool result = false;
                      	result = connect(this, SIGNAL(testSignal()), this, SLOT("testSlot()"));
                      	qDebug() << result;
                      }
                      
                      MainWindow::~MainWindow()
                      {
                      }
                      
                      void MainWindow::testSlot()
                      {
                      
                      }
                      
                      

                      but I still receive:
                      QObject::connect: No such slot MainWindow::"testSlot()" in ../connections/MainWindow.cpp:8
                      false

                      Do you have any ideas?

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

                      @poor_robert said in Connecting to slot by string name:

                      I want to know how to connect with slot name in parenthesis so SLOT("testSlot()"));

                      Why? Why do you want to use "?

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

                      mrjjM 1 Reply Last reply
                      3
                      • jsulmJ jsulm

                        @poor_robert said in Connecting to slot by string name:

                        I want to know how to connect with slot name in parenthesis so SLOT("testSlot()"));

                        Why? Why do you want to use "?

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

                        Hi
                        the SLOT macro converts the function name to a string and hence using a string will not be converted correctly.

                        # define SLOT(a)     qFlagLocation("1"#a QLOCATION)
                        

                        And to add to @jsulm , why you want as string anyway ??

                        1 Reply Last reply
                        2
                        • P Offline
                          P Offline
                          poor_robert
                          wrote on last edited by
                          #12

                          Hello @jsulm and @mrjj

                          The code given above was just an example. The real reason was to use slot as callback. I have created following method and wanted to do following connection:

                          void MyClass::setCallback(QObject * obj, const char* slotName)
                          {
                              connect(m_member, SIGNAL(updated()), obj, SLOT(slotName));
                          }
                          

                          in my implementation obj is class derived from the QObject. I have solved the problem with help of std::function used as callbacks.
                          Do you know how to solve this in Qt way?

                          m.sueM jsulmJ 2 Replies Last reply
                          0
                          • BjornWB Offline
                            BjornWB Offline
                            BjornW
                            wrote on last edited by BjornW
                            #13

                            I do not know if you can make that work; I doubt it.

                            Regardless, I think it is a bad idea :). How do you intend to use this? Why? If you retrace your steps a bit and explain what you are doing you may get a good suggestion out of this, I think!

                            1 Reply Last reply
                            1
                            • P poor_robert

                              Hello @jsulm and @mrjj

                              The code given above was just an example. The real reason was to use slot as callback. I have created following method and wanted to do following connection:

                              void MyClass::setCallback(QObject * obj, const char* slotName)
                              {
                                  connect(m_member, SIGNAL(updated()), obj, SLOT(slotName));
                              }
                              

                              in my implementation obj is class derived from the QObject. I have solved the problem with help of std::function used as callbacks.
                              Do you know how to solve this in Qt way?

                              m.sueM Offline
                              m.sueM Offline
                              m.sue
                              wrote on last edited by m.sue
                              #14

                              @poor_robert said in Connecting to slot by string name:

                              Just use the SLOT at the place where you call the function:

                              void MyClass::setCallback(QObject * obj, const char* slotName)
                              {
                                  connect(m_member, SIGNAL(updated()), obj, slotName);
                              }
                              
                              setCallback(myObj,SLOT(myFunction()));
                              

                              -Michael.

                              jsulmJ 1 Reply Last reply
                              5
                              • P poor_robert

                                Hello @jsulm and @mrjj

                                The code given above was just an example. The real reason was to use slot as callback. I have created following method and wanted to do following connection:

                                void MyClass::setCallback(QObject * obj, const char* slotName)
                                {
                                    connect(m_member, SIGNAL(updated()), obj, SLOT(slotName));
                                }
                                

                                in my implementation obj is class derived from the QObject. I have solved the problem with help of std::function used as callbacks.
                                Do you know how to solve this in Qt way?

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

                                @poor_robert Just pass SLOT(mySlot()) to setCallback :-)

                                void MyClass::setCallback(QObject * obj, const char* slotStr)
                                {
                                    connect(m_member, SIGNAL(updated()), obj, slotStr);
                                }
                                
                                setCallback(obj, SLOT(mySlot()));
                                

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

                                1 Reply Last reply
                                5
                                • m.sueM m.sue

                                  @poor_robert said in Connecting to slot by string name:

                                  Just use the SLOT at the place where you call the function:

                                  void MyClass::setCallback(QObject * obj, const char* slotName)
                                  {
                                      connect(m_member, SIGNAL(updated()), obj, slotName);
                                  }
                                  
                                  setCallback(myObj,SLOT(myFunction()));
                                  

                                  -Michael.

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

                                  @m.sue You were faster :-)

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

                                  m.sueM 1 Reply Last reply
                                  0
                                  • jsulmJ jsulm

                                    @m.sue You were faster :-)

                                    m.sueM Offline
                                    m.sueM Offline
                                    m.sue
                                    wrote on last edited by
                                    #17

                                    Hi @jsulm

                                    Just seconds :-)

                                    1 Reply Last reply
                                    1
                                    • P Offline
                                      P Offline
                                      poor_robert
                                      wrote on last edited by
                                      #18

                                      Hello @jsulm and @m-sue

                                      This did the job :). Thanks for the help!

                                      1 Reply Last reply
                                      1

                                      • Login

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