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 7.1k 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 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