4

I'm trying to do a program which makes some operations with sounds. My question is that I have 3 Play pushbutton and 3 label. I want that whichever I click on the Play button, the sound whose name is in the label that is near the pushbutton should play. I have a play slot without any parameter. So, how can I connect to every play button with every label respectively? Actually, I can write 3 different play function, but since I have some other functions, it will be too long and confusing. Also, I need 3 play button because I want to play 3 sounds simultaneously.

Enes Altuncu
  • 449
  • 2
  • 7
  • 14

3 Answers3

7

For example by connecting the clicked signal from all the buttons to a slot, and then use QObject::sender() to find out which button it was.

Let's assume your buttons are named pushButton, pushButton_2 and pushButton_3 and labels label, label_2 and label_3 respectively.

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(play()));
    connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(play()));
    connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(play()));
}

void MainWindow::play()
{
    QString piece;
    QObject* button = QObject::sender();
    if (button == ui->pushButton)
    {
        piece = ui->label->text();
    }
    else if (button == ui->pushButton_2)
    {
        piece = ui->label_2->text();
    }
    else
    {
        piece = ui->label_3->text();
    }

    qDebug() << "Starting to play:" << piece;
}
talamaki
  • 5,324
  • 1
  • 27
  • 40
  • Thank you very good idea. But, my play function is a slot that doesn't take an argument. So, how can I do this thing with my play function? – Enes Altuncu Aug 24 '15 at 13:36
2

You can also assign the three buttons to a QButtonGroup and use its signal void QButtonGroup::buttonClicked(int id), which gives you the id of a pushbutton which was clicked. Just make sure to set the IDs of each button beforehand(for instance in the constructor or some init function). By doing so, you don't have to deal with pointers.

https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#buttonClicked-2 https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#setId

danmar
  • 44
  • 7
1

In modern code, you should use the Qt 5's connect syntax and simply connect to a functor when your action is trivial, like yours is:

// Interface
#include "ui_MainWindow.h"

class MainWindow : public QMainWindow {
  Q_OBJECT
  Ui::MainWindow ui;
  QVector<QString> m_pieces;
  ...
public:
  explicit MainWindow(QWidget *parent = nullptr);
  void play(const QString &piece);
};

// Implementation
MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent)
{
  ui.setupUi(this);
  unsigned i = 0;
  for(auto *button :
        {&ui.pushButton_1, &ui.pushButton_2, &ui.pushButton_3}) {
    connect(button, &QPushButton::clicked, [this, i]{
      if (m_pieces.size() > i) play(m_pieces[i]);
    });
    i ++;
  }
}

void MainWindow::play(const QString & piece) {
  ...
}
Kuba hasn't forgotten Monica
  • 95,931
  • 16
  • 151
  • 313