首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取哪个QradioButton调用时隙

如何获取哪个QradioButton调用时隙
EN

Stack Overflow用户
提问于 2013-08-13 02:55:19
回答 5查看 12.6K关注 0票数 4

我创建了几个QradioButton并连接到同一个插槽。在插槽中,我想知道哪个QradioButton调用时隙并执行相关操作。我发现有一种使用qobject_cast和QObject::sender()的方法,但它似乎不起作用。以下是代码:

头文件:

代码语言:javascript
复制
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;
};

主档案:

代码语言:javascript
复制
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();
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-13 07:38:12

您可以为每个单选按钮创建单独的包装槽,然后将信息传递给要调用的函数。就像这样:-

代码语言:javascript
复制
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);

};

然后连接每个单选按钮:-

代码语言:javascript
复制
connect(radio1,SIGNAL(clicked()),this,SLOT(Radio1Selected()));
connect(radio2,SIGNAL(clicked()),this,SLOT(Radio2Selected()));
connect(radio3,SIGNAL(clicked()),this,SLOT(Radio3Selected()));

现在,当调用setText_2时,id将表示选定的单选按钮。

票数 2
EN

Stack Overflow用户

发布于 2013-08-13 06:10:57

即使使用sender()方法解决了您的问题,我也不建议使用它。问题是,信号和插槽的设计是为了分离发射器和接收器。接收者不需要知道哪些对象,甚至哪种类型的对象可以触发它的插槽。当您使用sender()时,您所依赖的事实是,接收方了解触发其插槽的所有对象。如果这种情况在未来发生变化呢?

您应该看看QSignalMapper,它是专门为这种需求而设计的。在文档中有关于它的很好的例子。

票数 5
EN

Stack Overflow用户

发布于 2013-08-13 04:25:43

您正在setText_2()上正确地获取发送方对象,但没有设置radio1、radio2和radio3的objectName属性。请使用"setObjectName( )“API。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18199916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档