2012-01-01 8 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); 

     } 
} 

Mam kilka przycisków QPushButon, które są dodawane automatycznie. Czy istnieje sposób dodania "atrybutu id lub czegoś innego" do przycisku, a następnie wiedzieć, który przycisk został kliknięty? Dla każdego przycisku mam inną akcję.Qt, PushButton, atrybut id? Dowolny sposób sprawdzenia, który przycisk został kliknięty:

Odpowiedz

5

QApplication oferuje sender(), który zawiera który obiekt wysłał sygnał. Więc można zrobić:

//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 jest bardzo dobry do tego typu rzeczy.

Można by określić swoje gniazdo tak na przykład:

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

Następnie dodać członka QSignalMapper* do swojej klasy i podłączyć go do tego gniazda:

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

W addRadioToUI, po utworzeniu przycisk, wykonaj:

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

Jeśli wszystko czego potrzebujesz to wskaźnik do obiektu, który wyzwalał sygnał, ale możesz użyć funkcji statycznej QOjbect::sender w swoim gnieździe, aby uzyskać do tego uchwyt.

+0

Po utworzeniu 'signalMapper' potrzebujesz go do odbierania wszystkich sygnałów, które chcesz przekazać. Będziesz potrzebował wywołania typu 'connect (ui-> pushButton_1, SIGNAL (kliknięty()), signalMapper, SLOT (map()));' zaraz po 'signalMapper' jest tworzony i powinien zostać powtórzony dla wszystkich obiektów, które chcesz do odbioru. – zar

2

Użyj QButtonGroup. Przyjmuje id jako parametr po dodaniu przycisku i podaje identyfikator do gniazda, gdy przycisk w grupie jest wciśnięty.