qt如何知道按钮被点击了?
qt how to know that a pushbutton is clicked?
我想做一个程序,用声音进行一些操作。我的问题是我有 3 个播放按钮和 3 个标签。我希望无论我点击“播放”按钮,都应该播放名称在按钮附近的标签中的声音。
我有一个没有任何参数的播放槽。那么,我怎样才能分别连接到每个标签的每个播放按钮呢?实际上,我可以写 3 个不同的播放功能,但由于我还有一些其他功能,所以它会太长且令人困惑。另外,我需要 3 个播放按钮,因为我想同时播放 3 个声音。
例如,将所有按钮的 clicked 信号连接到一个插槽,然后使用 QObject::sender() 找出它是哪个按钮。
假设您的按钮名为 pushButton、pushButton_2 和 pushButton_3 以及标签 标签,label_2和label_3。
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;
}
在现代代码中,您应该使用 Qt 5 的 connect
语法,并在您的操作微不足道时简单地连接到仿函数,例如您的操作:
// 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) {
...
}
您还可以将这三个按钮分配给 QButtonGroup
并使用其信号 void QButtonGroup::buttonClicked(int id)
,这会为您提供被单击按钮的 id .只需确保事先设置每个按钮的 ID(例如在构造函数或某些初始化函数中)。通过这样做,您不必处理指针。
https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#buttonClicked-2
https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#setId
我想做一个程序,用声音进行一些操作。我的问题是我有 3 个播放按钮和 3 个标签。我希望无论我点击“播放”按钮,都应该播放名称在按钮附近的标签中的声音。 我有一个没有任何参数的播放槽。那么,我怎样才能分别连接到每个标签的每个播放按钮呢?实际上,我可以写 3 个不同的播放功能,但由于我还有一些其他功能,所以它会太长且令人困惑。另外,我需要 3 个播放按钮,因为我想同时播放 3 个声音。
例如,将所有按钮的 clicked 信号连接到一个插槽,然后使用 QObject::sender() 找出它是哪个按钮。
假设您的按钮名为 pushButton、pushButton_2 和 pushButton_3 以及标签 标签,label_2和label_3。
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;
}
在现代代码中,您应该使用 Qt 5 的 connect
语法,并在您的操作微不足道时简单地连接到仿函数,例如您的操作:
// 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) {
...
}
您还可以将这三个按钮分配给 QButtonGroup
并使用其信号 void QButtonGroup::buttonClicked(int id)
,这会为您提供被单击按钮的 id .只需确保事先设置每个按钮的 ID(例如在构造函数或某些初始化函数中)。通过这样做,您不必处理指针。
https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#buttonClicked-2 https://doc.qt.io/archives/qt-4.8/qbuttongroup.html#setId