2016-03-02 89 views
0

我想學習Qt,並希望從一個小項目開始。爲什麼我的連接不能觸發信號功能?

我在名爲「playPauseButton」的項目中添加了一個按鈕。目前,我正嘗試將它連接到一個應該處理所有按鈕事件的類中的信號,並使用SLOT中給出的枚舉值確定當前事件。

這是我的代碼現在:

connect(ui.playPauseButton, SIGNAL(clicked()), m_uiInit.get(), SLOT(ClickEvents(Buttons::PausePlayButton))); 

注意m_uiInit是指向其在它的ClickEvents()方法的類shared_ptr

std::shared_ptr<UIInit> m_uiInit = std::shared_ptr<UIInit>(new UIInit()); 

我在UIInit類看起來插槽像這樣:

頭:

public slots: 

    void ClickEvents(Buttons button); 

.cpp的:

void UIInit::ClickEvents(Buttons button) 
{ 
    switch (button) 
    { 
    case Buttons::PausePlayButton: 
     //Do something 
     break; 
    } 
} 

誰能向我解釋這是爲什麼不工作?

我懷疑這是由connect()調用中的第三個參數造成的。我經常用「this」看到它,但我讀了它並發現它似乎必須是一個指向包含SLOT方法的類的對象的指針?

任何人都可以幫我嗎?

回答

1

您的信號和插槽簽名之間不一致 - 信號沒有參數,插槽需要一個參數。簽名必須匹配,如果信號有一個int和一個浮點參數,則可以,但在這種情況下,您可以連接到只接受int參數的槽,並且該float將被丟棄。在你的情況下,你將signal(void)連接到slot(enum),但枚舉值從哪裏來?

相反創建另一個插槽不帶參數和信號連接到它,並且在該時隙m_uiInit.get()->ClickEvents(Buttons::PausePlayButton);

在Qt在連接時不指定信號參數,但在信號發射 - emit someSignal(param)。這就是說,你可以使用Qt5中可用的新連接語法,並連接到一個lambda,它將捕獲所需的數據。這將是類似於創建的輔助槽,但它會爲每一個按鈕,而不是(僅工作在QT5 +)未命名的函數:

connect(ui->playPauseButton, &QPushButton::clicked, [=](){ m_uiInit.get()->ClickEvents(Buttons::PausePlayButton); }); 

順便說一句,ui是一個指針,所以ui.playPauseButton是錯誤的,以及。

+0

「這應該處理所有的按鈕事件類」有沒有辦法來然後使用一個通用槽功能,但仍然能夠確定哪個按鈕稱爲功能?我將不得不提供某種信息,對吧? – Sossenbinder

+0

@Sossenbinder - 檢查更新 – dtech

+0

謝謝,這完美的作品。最後是一些C++ home土壤,帶有lambda表達式:)關於ui,它被自動生成爲我的例子中的一個對象。我實際上認爲這是標準行爲 – Sossenbinder

0

1)如果連接失敗,你應該得到一個運行時警告

2)看QSignalMapper的東西