2012-01-01 14 views
6
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をautomaticllyで追加しました。 「id属性またはsth else」をボタンに追加して、次にどのボタンがクリックされたかを知る方法はありますか?私は各ボタンごとに異なるアクションを持っています。Qt、PushButton、id属性?どのボタンがクリックされたかを知るための方法

答えて

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

5

QSignalMapperは事のこのタイプのためにかなり良いです。

あなたは、例えば、このようなあなたのスロットを定義します

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

を次に、あなたのクラスにQSignalMapper*メンバーを追加し、そのスロットに接続:addRadioToUI

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

、あなたの作成した後、プッシュボタン:

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

シグナルをトリガしたオブジェクトへのポインタですが、スロット内の静的なQOjbect::sender関数を使用してそのハンドルを取得することができます。

+0

'signalMapper'が作成された後、あなたが送信したいすべてのシグナルを受信する必要があります。 'signalMapper'が作成された直後に' connect(ui-> pushButton_1、SIGNAL(clicked())、signalMapper、SLOT(map()));というような呼び出しが必要です。それは受信する。 – zar

2

QButtonGroupを使用します。ボタンが追加されたときにパラメータとしてidを受け取り、グループのボタンが押されたときにidをスロットに提供します。

関連する問題