C++ qt如何知道按钮被点击?

C++ qt如何知道按钮被点击?,c++,qt,visual-studio-2013,qt-designer,qpushbutton,C++,Qt,Visual Studio 2013,Qt Designer,Qpushbutton,我想做一个程序,用声音做一些操作。我的问题是我有3个播放按钮和3个标签。我希望无论我点击哪个播放按钮,按钮附近标签上的名字都应该播放。 我有一个没有任何参数的播放槽。那么,如何分别连接到每个标签上的每个播放按钮?实际上,我可以编写3个不同的播放函数,但由于我还有其他一些函数,所以太长,太混乱了。另外,我需要3个播放按钮,因为我想同时播放3种声音。例如,将所有按钮的单击信号连接到一个插槽,然后使用QObject::sender()找出它是哪个按钮 让我们假设您的按钮分别命名为Button、Butt

我想做一个程序,用声音做一些操作。我的问题是我有3个播放按钮和3个标签。我希望无论我点击哪个播放按钮,按钮附近标签上的名字都应该播放。
我有一个没有任何参数的播放槽。那么,如何分别连接到每个标签上的每个播放按钮?实际上,我可以编写3个不同的播放函数,但由于我还有其他一些函数,所以太长,太混乱了。另外,我需要3个播放按钮,因为我想同时播放3种声音。

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

让我们假设您的按钮分别命名为Button、Button_2和Button_3以及labels label、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;
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
连接(ui->按钮,信号(点击()),此,插槽(播放());
连接(用户界面->按钮2,信号(点击()),此,插槽(播放());
连接(用户界面->按钮3,信号(点击()),此,插槽(播放());
}
void主窗口::play()
{
QString片;
QObject*按钮=QObject::sender();
如果(按钮==用户界面->按钮)
{
工件=用户界面->标签->文本();
}
else if(按钮==ui->按钮2)
{
工件=ui->label_2->text();
}
其他的
{
工件=ui->label_3->text();
}

qDebug()在现代代码中,您应该使用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) {
  ...
}
//接口
#包括“ui_main window.h”
类主窗口:公共QMainWindow{
Q_对象
Ui::主窗口Ui;
qvectorm_片段;
...
公众:
显式主窗口(QWidget*parent=nullptr);
无效播放(常量字符串和片段);
};
//实施
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父窗口)
{
ui.setupUi(这个);
无符号i=0;
对于(自动*按钮:
{&ui.butdown_1、&ui.butdown_2、&ui.butdown_3}){
连接(按钮,&QPushButton::单击,[this,i]{
如果(m_pieces.size()>i)播放(m_pieces[i]);
});
i++;
}
}
void主窗口::播放(常量字符串和片段){
...
}

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


谢谢你的好主意。但是,我的播放函数是一个不带参数的插槽。那么,我如何使用播放函数来完成这件事呢?