【问题标题】:Qt, PushButton, id attribute? Any way to know which button was clickedQt、PushButton、id 属性?任何知道点击了哪个按钮的方法
【发布时间】:2012-01-01 10:47:03
【问题描述】:
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 属性或其他”添加到按钮,然后知道单击了哪个按钮?我对每个按钮都有不同的操作。

【问题讨论】:

    标签: c++ qt attributes


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      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 函数来获取它的句柄。

      【讨论】:

      • signalMapper 创建后,您需要它接收您希望它汇出的所有信号。在创建signalMapper 之后,您将需要像connect(ui->pushButton_1, SIGNAL(clicked()), signalMapper, SLOT(map()) ); 这样的调用,并且应该为您希望它接收的所有对象重复调用。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 1970-01-01
        • 2017-11-17
        相关资源
        最近更新 更多