Search code examples
c++qtqt4

How to get which QradioButton invoke the SLOT


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();
}

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.