【问题标题】:qt how to know that a pushbutton is clicked?qt如何知道按钮被点击了?
【发布时间】:2021-02-01 14:31:54
【问题描述】:

我正在尝试做一个用声音进行一些操作的程序。我的问题是我有 3 个播放按钮和 3 个标签。我希望无论我点击播放按钮,按钮附近标签中名称的声音都应该播放。 我有一个没有任何参数的播放槽。那么,如何分别使用每个标签连接到每个播放按钮?其实,我可以写3个不同的播放函数,但是因为我还有一些其他的函数,所以它会太长和混乱。另外,我需要 3 个播放按钮,因为我想同时播放 3 个声音。

【问题讨论】:

    标签: c++ qt visual-studio-2013 qt-designer qpushbutton


    【解决方案1】:

    例如通过将所有按钮的clicked信号连接到一个插槽,然后使用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;
    }
    

    【讨论】:

    • 谢谢你的好主意。但是,我的 play 函数是一个不带参数的插槽。那么,我怎样才能用我的播放功能来做这件事呢?
    【解决方案2】:

    您还可以将三个按钮分配给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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多