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. Passing Data to a Slot

Passing Data to a Slot

Scheduled Pinned Locked Moved General and Desktop
13 Posts 5 Posters 34.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.
  • B Offline
    B Offline
    Brandon
    wrote on last edited by
    #3

    Thanks, but how would this look in the example I gave?

    1 Reply Last reply
    0
    • U Offline
      U Offline
      utcenter
      wrote on last edited by
      #4

      @// in the header
      signals:
      void mySignal(int value);
      public slots:
      void myHandler(int value) {
      qDebug() << "value is" << value;
      }

      // in the implementation
      ...
      connect(this, SIGNAL(mySignal(int)), this, SLOT(myHandler(int)));
      ...
      emit mySignal(7);
      emit mySignal(someIdentifier);
      emit mySignal(someFunction());@

      1 Reply Last reply
      2
      • B Offline
        B Offline
        Brandon
        wrote on last edited by
        #5

        So I used both this connect() and also the one I had which connects the clicked() event? Will it pass the number when and only when the clicked() event occurs? When the button is clicked, it has to pass whatever number applies at that moment.

        1 Reply Last reply
        0
        • U Offline
          U Offline
          utcenter
          wrote on last edited by
          #6

          No, clicked doesn't emit a value, it emits void, you have to connect clicked to another slot that emits the value to the slot that accepts the value

          @// in the header
          signals:
          void mySignal(int value);

          public slots:
          void myHandler(int value) { // this method will receive the value
          qDebug() << "value is" << value;
          }

          void buttonHandler(){ // the button will execute this method to pass a value
              i = 10;
              emit myHandler(i);
          }
          

          private:
          int i; // this is the value

          // in the constructor
          QPushButton *button = new QPushButton("emit", this);

          connect(button, SIGNAL(clicked()), this, SLOT(buttonHandler()));
          connect(this, SIGNAL(mySignal(int)), this, SLOT(myHandler(int)));@

          So when you press the button, it will emit the clicked() signal, which will trigger the buttonHandler() slot, which will emit the value to the myHandler slot, which will output it.

          If you have a signal that actually emits a value you don't have to do that, but QPushButton's clicked() signal doesn't have any parameters, so you either have to bind a value, to subclass and overload the clicked() signal to emit a value, or use an additional stage to emit the value, as in the example above.

          1 Reply Last reply
          0
          • B Offline
            B Offline
            Brandon
            wrote on last edited by
            #7

            When the clicked() signal triggers buttonHandler(), how does buttonHandler() get the data (x in my example) so that it can emit the value to myHandler()?

            1 Reply Last reply
            0
            • S Offline
              S Offline
              steno
              wrote on last edited by
              #8

              You can also take a look at QSignalMapper. It allows you to bind signals to slots through a mapping.

              "QSignalMapper":http://qt-project.org/doc/qt-4.8/qsignalmapper.html#details

              1 Reply Last reply
              0
              • U Offline
                U Offline
                utcenter
                wrote on last edited by
                #9

                The data is the i member of the class this all happens. This is just an example, in an actual real world scenario you will pass the value from one object to another.

                For example you may have a user interface with a line edit and a button, and you want to send the content of the line edit to some other class when you click the button.

                The button itself cannot send the value, it can only emit a void signal(void), which you can connect to an accessor method of the user interface, which will be connected to the object you want to send the content of the line edit. So you have it like that:

                UI -> button is clicked -> accessor method is ativated, emits a signal that actually passes a value with the value of the line edit -> the signal is connected to the object you want to send the data from the UI

                ui button -> ui slot -> emit signal with value from the ui -> another object receives the value from the ui

                1 Reply Last reply
                0
                • B Offline
                  B Offline
                  Brandon
                  wrote on last edited by
                  #10

                  Thanks, guys, but I guess it's time to fall back on global variables.

                  1 Reply Last reply
                  0
                  • U Offline
                    U Offline
                    utcenter
                    wrote on last edited by
                    #11

                    Globals are not necessarily a solution, while using them wisely is not problematic, there are many ways to misuse them.

                    This is NOT the case to use globals, using globals for such trivial stuff is BAD PROGRAMMING PRACTICE!!!

                    I still fail to see what is your problem with signals and slots. Let me put a more practical example - as I mentioned a UI that passes a UI element's value to another object:

                    Upon pressing the "Send value" button, the content of the line edit will be send to MyClass, which will output it.

                    The "Send value" button triggers a slot inside of MyWidget that emits another signal with the content of the line edit to the MyClass instance.

                    MyWidget.h
                    @class MyWidget : public QWidget
                    {
                    Q_OBJECT
                    public:
                    explicit MyWidget(QWidget *parent = 0);

                    signals:
                    void redirectData(QString data);

                    public slots:
                    void sendData(){emit redirectData(edit->text());}

                    private:
                    QPushButton *button;
                    QLineEdit *edit;
                    MyClass *myClass; // the object to receive and output the data
                    };@

                    MyWidget.cpp
                    @MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
                    {
                    button = new QPushButton("Send value", this);
                    edit = new QLineEdit(this);
                    myClass = new MyClass(this);
                    QHBoxLayout *layout = new QHBoxLayout(this);
                    layout->addWidget(button);
                    layout->addWidget(edit);

                    connect(button, SIGNAL(clicked()), this, SLOT(sendData()));
                    connect(this, SIGNAL(redirectData(QString)), myClass, SLOT(outputData(QString)));
                    

                    }@

                    MyClass.h
                    @class MyClass : public QObject
                    {
                    Q_OBJECT
                    public:
                    explicit MyClass(QObject *parent = 0) : QObject(parent) {}

                    public slots:
                    void outputData(QString data){
                    qDebug() << data;
                    }
                    };
                    @

                    Pressing the button triggers the sendData slot, which emits the redirectData signal with the content of the line edit, which is connected to the MyClass instance, which outputs the value.

                    1 Reply Last reply
                    0
                    • 1 Offline
                      1 Offline
                      1nJ8
                      wrote on last edited by
                      #12

                      Hello,

                      I red all of this subject , I understood some of the informations and I realize that I'm actually in the same case that Brandon.
                      I would like to pass a QLineEdit in a QString in order to add it in a QListWidget after. But I can't recup my QLineEdit with a button validation because I have ( I suppose ) a problem with public slots and signals.

                      This is my code :

                      add_window.h

                      #ifndef ADD_WINDOW_H
                      #define ADD_WINDOW_H
                      
                      #include <QtGui>
                      #include <QtWidgets>
                      #include <QString>
                      #include <QMessageBox>
                      #include <iostream>
                      #include <cstdlib>
                      
                      class Add_window : public QWidget
                      {
                          Q_OBJECT
                      
                        public:
                          Add_window();
                      
                        public slots:
                          void SendData(QString contenu);
                      
                        private:
                          QLineEdit *URL;
                          QPushButton *validation;
                          QPushButton *annulation;
                      
                      
                      };
                      
                      #endif // ADD_WINDOW_H
                      

                      add_window.cpp

                      #include "add_window.h"
                      
                      
                      
                      
                      Add_window::Add_window() : QWidget()
                      {
                      
                      
                          QLineEdit *URL = new QLineEdit;
                          QString contenu = URL->text();
                          QPushButton *validation = new QPushButton(tr("OK"));
                          connect(validation, SIGNAL(clicked()), this, SLOT(SendData(QString contenu)));
                          QPushButton *annulation = new QPushButton(tr("Annuler"));
                          connect(annulation, SIGNAL(clicked()), this, SLOT(close()));
                      
                      
                          QHBoxLayout *HLayout = new QHBoxLayout;
                      
                          URL->setText("Entrer une URL");
                          HLayout->addWidget(URL);
                          HLayout->addWidget(validation);
                          HLayout->addWidget(annulation);
                          setLayout(HLayout);
                      
                      }
                      
                      void Add_window::SendData(QString contenu)
                      {
                          //Récupération de l'URL
                      
                          //QString contenu = URL->text();  If i try to recup the value here , my program crashes when I click on the validation button
                          QMessageBox::information(this, "URL", QString("phrase") + contenu);
                          //QMessageBox::information(this, "URL", "test");
                      }
                      

                      So I don't know where I have to recup my QString if it has to be after the new QLineEdit or in the "void Add_window::SendData()"...

                      1 Reply Last reply
                      0
                      • mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by mrjj
                        #13

                        Hi and welcome
                        There are some issues with the code I like to talk about
                        1): there are 2 URL
                        private:
                        QLineEdit *URL;
                        but you say
                        QLineEdit *URL = new QLineEdit; // this makes a local URL. not the one from private
                        Im wonder if u mean
                        URL = new QLineEdit; // allocate teh private one

                        2:)
                        connect(validation, SIGNAL(clicked()), this, SLOT(SendData(QString contenu)));
                        You don't pass actual parameters in connect statement. its for setup only.
                        Also, the button has clicked() and it has no parameters. so you cant
                        really hook up signal click with your slot :SendData(QString contenu)
                        as its missing the QString .

                        3:)
                        I guess u crash in SendData
                        QString contenu = URL->text();// If i try to recup the value here
                        As you are using the private URL which is not NEWed.

                        so if you
                        make
                        void Add_window::SendData(QString contenu)
                        to
                        void Add_window::SendData()

                        and
                        connect(validation, SIGNAL(clicked()), this, SLOT(SendData(QString contenu)));
                        to
                        connect(validation, SIGNAL(clicked()), this, SLOT(SendData()));

                        and "new" the private URL then it should work.
                        in
                        void Add_window::SendData()
                        {
                        //Récupération de l'URL
                        QString contenu = URL->text();

                        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