Qt如何知道按钮被点击

qt how to know that a pushbutton is clicked?

本文关键字:按钮 何知道 Qt      更新时间:2023-10-16

我正在尝试做一个程序,使一些操作与声音。我的问题是我有3个播放按钮和3个标签。我希望无论我点击播放按钮,其名称在按钮附近的标签应该播放的声音。我有一个没有任何参数的播放槽。那么,我该如何分别连接到带有每个标签的每个播放按钮呢?实际上,我可以写3个不同的play函数,但由于我还有一些其他的函数,它会太长,令人困惑。此外,我需要3个播放按钮,因为我想同时播放3个声音。

例如,通过连接所有按钮的点击信号到一个插槽,然后使用QObject::sender()来找出它是哪个按钮。

让我们假设你的按钮命名为pushButton, pushButton_2pushButton_3,标签分别为label, label_2label_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;
}

您还可以将三个按钮分配给QButtonGroup并使用其信号void QButtonGroup::buttonClicked(int id),这将为您提供单击的按钮的id。只需确保事先设置每个按钮的id(例如在构造函数或某些初始化函数中)。通过这样做,您不必处理指针。

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

在现代代码中,您应该使用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) {
  ...
}