Qt,PushButton,id属性?任何方式知道点击了哪个按钮

时间:2012-01-01 10:47:04

标签: c++ qt attributes

void MainWindow::addRadioToUI()
{       int button_cunter=4;
        while(!database.isEmpty())
        {       button_cunter++;

                QPushButton *one = new QPushButton("Play: "+name(get_r.getTrackId()));
                one->setIcon(QIcon(":/images/play_button.png"));
                one->setMaximumWidth(140);
                one->setFlat(true);

                QGroupBox* get_rGB = new QGroupBox("somethink"); 
                QFormLayout* layout = new QFormLayout; 
                if(button_cunter%5 == 0){
                    layout->addWidget(one);

                }

                get_rGB->setLayout(layout);
                scrollAreaWidgetContents->layout()->addWidget(get_rGB);

        }
}

我有一些自动添加的QPushButtons。 有没有办法在按钮上添加“id属性或者其他”,然后知道点击了哪个按钮?我对每个按钮都有不同的动作。

3 个答案:

答案 0 :(得分:5)

QApplication提供sender(),其中包含发送信号的对象。所以你可以这样做:

//slot, this could also be done in a switch
if(button[X] == QApplication::sender()){
  doX();
}else if(button[Y] == QApplication::sender()){
  doY();
}

http://doc.qt.io/qt-4.8/qobject.html#sender

答案 1 :(得分:5)

QSignalMapper对于这类事情非常有用。

您可以像这样定义您的插槽:

public slots:
   void clicked(int buttonId);  // or maybe trackId

然后将QSignalMapper*成员添加到您的班级并将其连接到该广告位:

    signalMapper = new QSignalMapper(this);
    connect(signalMapper, SIGNAL(mapped(int)),
            this,         SLOT(clicked(int)));

addRadioToUI中,创建按钮后,执行:

   signalMapper.setMapping(one, button_cunter);
                             // or trackId if that's more practical

如果您只需要一个指向触发信号的对象的指针,您可以使用插槽中的静态QOjbect::sender函数来获取该函数。

答案 2 :(得分:2)

使用QButtonGroup。添加按钮时会将id作为参数,并在按下组中的按钮时将id提供给插槽。