qt如何知道按下了一个按钮?

问题描述 投票:2回答:3

我正在尝试做一个用声音进行一些操作的程序。我的问题是我有3个Play按钮和3个标签。我希望无论我点击“播放”按钮,其名称都在按钮附近的标签中的声音应该播放。我有一个没有任何参数的播放槽。那么,我如何分别连接每个标签的每个播放按钮?实际上,我可以编写3种不同的播放功能,但由于我有一些其他的功能,它会太长而且令人困惑。另外,我需要3个播放按钮,因为我想同时播放3个声音。

c++ qt visual-studio-2013 qt-designer qpushbutton
3个回答
3
投票

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

假设您的按钮分别命名为pushButton,pushButton_2和pushButton_3,并分别标记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;
}

0
投票

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

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


-1
投票

在现代代码中,您应该使用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) {
  ...
}
© www.soinside.com 2019 - 2024. All rights reserved.