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.
问题:
回答1:
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;
}
回答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
回答3:
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) {
...
}