How to get which QradioButton invoke the SLOT

c++, qt, qt4

Solution

You could create separate wrapper slots for each radio button, which then passes the information to the function you want to call. Something like this: -

class dialoginput : public QDialog
{
    Q_OBJECT

public:
    QRadioButton *radio1;
    QRadioButton *radio2;
    QRadioButton *radio3;

private slots:
   void Radio1Selected() { setText_2(1); }
   void Radio2Selected() { setText_2(2); }
   void Radio3Selected() { setText_2(3); }

private:
   void setText_2(int id);

};

Then connect each radio button: -

connect(radio1,SIGNAL(clicked()),this,SLOT(Radio1Selected()));
connect(radio2,SIGNAL(clicked()),this,SLOT(Radio2Selected()));
connect(radio3,SIGNAL(clicked()),this,SLOT(Radio3Selected()));

Now when setText_2 is called, the id will represent the selected radio button.

Problem

I create several QradioButton and connect to the same SLOT. In the slot, I want to know which QradioButton invoke the slot and do the related action. I found there is a way by using qobject_cast and QObject::sender(), but it seems not work. Here is the code: header file: ``` class dialoginput : public QDialog { Q_OBJECT public: dialoginput(QWidget *parent = 0); QRadioButton *radio1; QRadioButton *radio2; QRadioButton *radio3; private slots: void setText_2(); private: QLabel *label_0_0; QLabel *label_1; }; ``` main file: ``` dialoginput::dialoginput(QWidget *parent): QDialog(parent){ label_0_0 = new QLabel("label_1:"); label_1 = new QLabel; QWidget *window = new QWidget; QVBoxLayout *windowLayout = new QVBoxLayout; QGroupBox *box = new QGroupBox("Display Type"); radio1 = new QRadioButton("3"); radio2 = new QRadioButton("5"); radio3 = new QRadioButton("9"); QVBoxLayout *radioLayout = new QVBoxLayout; connect(radio1,SIGNAL(clicked()),this,SLOT(setText_2())); connect(radio2,SIGNAL(clicked()),this,SLOT(setText_2())); connect(radio3,SIGNAL(clicked()),this,SLOT(setText_2())); radioLayout->addWidget(radio1); radioLayout->addWidget(radio2); radioLayout->addWidget(radio3); box->setLayout(radioLayout); windowLayout->addWidget(box); windowLayout->addWidget(label_0_0); windowLayout->addWidget(label_1); window->setLayout(windowLayout); window->show(); } void dialoginput::setText_2(){ QObject *object = QObject::sender(); QRadioButton* pbtn = qobject_cast<QRadioButton*>(object); QString name = pbtn->objectName(); label_1->setText(name); if(!QString::compare(name, "3")){ } else if(!QString::compare(name, "5")){ } else if(!QString::compare(name, "9")){ } } int main(int argc, char *argv[]) { QApplication a(argc, argv); dialoginput *input = new dialoginput(); return a.exec(); } ```

Original source