2015-08-24 143 views
1

我試圖做一個程序,使一些操作與聲音。我的問題是我有3個播放按鈕和3個標籤。我希望無論我點擊哪個Play按鈕,都會播放名稱位於按鈕附近的標籤中的聲音。 我有一個沒有任何參數的播放插槽。那麼,我怎樣才能分別連接到每個標籤的播放按鈕?實際上,我可以編寫3種不同的播放功能,但由於我還有其他一些功能,它會太長而令人困惑。另外,我需要3個播放按鈕,因爲我想同時播放3個聲音。qt如何知道按鈕被點擊?

回答

2

例如通過連接點擊從所有的按鈕信號到一個槽,然後使用的QObject ::發送者()找出它是哪個按鈕。

讓我們假設你的按鈕命名爲按鈕,pushButton_2pushButton_3和標籤標籤,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

謝謝你非常好的主意。但是,我的播放功能是一個沒有爭論的插槽。那麼,我怎麼用我的播放功能來做這件事呢? –

+0

編輯我的答案。 – talamaki

+0

是的,這段代碼非常好,非常感謝你...... –

0

在現代的代碼,你應該使用的Qt 5的connect語法和簡單地連接到一個仿函數,當你的行動是平凡的,像你這樣的:

// Interface 
#include "ui_MainWindow.h" 

class MainWindow : public QMainWindow { 
    Q_OBJECT 
    Ui::MainWindow ui; // not a pointer to make things easier 
    ... 
public: 
    explicit MainWindow(QWidget * parent = 0); 
    void play(const QString & piece); 
}; 

// Implementation 
MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    ui.setupUi(this); 
    connect(ui.pushButton_1, &QPushButton::clicked, [this]{ 
    play("piece for button 1"); 
    }); 
    connect(ui.pushButton_2, &QPushButton::clicked, [this]{ 
    play("piece for button 2"); 
    }); 
    connect(ui.pushButton_3, &QPushButton::clicked, [this]{ 
    play("piece for button 3"); 
    }); 
} 

void MainWindow::play(const QString & piece) { 
    ... 
} 
相關問題