C++ qt如何知道按钮被点击?
我想做一个程序,用声音做一些操作。我的问题是我有3个播放按钮和3个标签。我希望无论我点击哪个播放按钮,按钮附近标签上的名字都应该播放。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种声音。例如,将所有按钮的单击信号连接到一个插槽,然后使用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函数中).通过这样做,您不必处理指针
谢谢你的好主意。但是,我的播放函数是一个不带参数的插槽。那么,我如何使用播放函数来完成这件事呢?