4

複数の QradioButton を作成し、同じ SLOT に接続します。スロットでは、どの QradioButton がスロットを呼び出し、関連するアクションを実行するかを知りたいです。qobject_cast と QObject::sender() を使用する方法があることがわかりましたが、うまくいかないようです。コードは次のとおりです。

ヘッダファイル:

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

メインファイル:

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

5 に答える 5

5

このsender()方法を使用すると問題が解決しますが、使用することはお勧めしません。問題は、信号とスロットがエミッターとレシーバーを分離するように設計されていることです。レシーバーは、どのオブジェクトがそのスロットをトリガーできるかを知る必要はありません。を使用する場合sender()、レシーバーがそのスロットをトリガーするすべてのオブジェクトを認識しているという事実に依存しています。これが将来変更された場合はどうなりますか?

をご覧くださいQSignalMapper。この種のニーズに合わせて特別に設計されています。ドキュメントにはそれに関する良い例があります。

于 2013-08-13T06:10:57.080 に答える
1

setText_2() で送信者オブジェクトを正しく取得していますが、radio1、radio2、radio3 の objectName プロパティを設定していません。「setObjectName( )」API を使用してください。

于 2013-08-13T04:25:43.190 に答える
0

QButtonGroupを作成し、ラムダ式を使用することもできます(c++11)

class dialoginput : public QDialog
{
    Q_OBJECT

public:

private:
   void setText_2(int id);
   QRadioButton *radio1;
   QRadioButton *radio2;
   QRadioButton *radio3;
   QButtonGroup _btnGroup; 
};

3 QRadioButton を QButtonGroup に追加した後

_btnGroup.addButton(radio1, 1);
_btnGroup.addButton(radio2, 2);
_btnGroup.addButton(radio3, 3);

connect(&_btnGroup, static_cast<void(QButtonGroup::*)(int)>(&QButtonGroup::buttonClicked), [=](int id){
            setText_2(id);});
于 2018-08-03T09:57:35.600 に答える