2016-03-13 67 views
0

我試圖用QSignalMapper與我的按鈕,但我似乎無法讓它工作來觸發我的插槽。QSignalMapper不觸發SLOT

這是我的SignalMapper代碼:

以我頭:

... 
private: 

    QSignalMapper *mapper; 

以我CPP:

//Constructor: 
mapper = new QSignalMapper(this); 

//Init function, called by the constructor 
connect(mapper, SIGNAL(mapped(int)), this, SLOT(HandleSignalEvents(int))); 

這裏是我的按鈕連接到它的代碼:

connect(m_ui->addEntryButton, SIGNAL(clicked()), mapper, SLOT(map())); 
mapper->setMapping(m_ui->addEntryButton, 1); 

Both連接正在返回true作爲值,所以連接應該正確設置。然而,這個插槽沒有正被觸發的所有:

public slots: 

    void HandleSignalEvents(int); 

---------------------------------------- 

void UIController::HandleSignalEvents(int param) 
{ 
    //Do something  
} 

我沒有得到任何任何錯誤,所以我真的不能找出問題IST什麼。這兩個連接似乎都像往常一樣工作,但行動不會觸發。

這裏可能會出現什麼問題?

編輯:

注意m_signalMapper是類的私有成員的值。

EDIT2:

由於需求,這裏是我的整個構造函數鏈:

UIController::UIController(Ui::TodoListerClass &ui) 
{ 
    //Unrelated initializations 
    mapper = new QSignalMapper(this); 
    Init(); 
} 

void UIController::Init() 
{ 
    connect(mapper, SIGNAL(mapped(int)), this, SLOT(HandleSignalEvents(int))); 

    InitUI(); 
    InitBinds(); 
} 

void UIController::InitBinds() 
{ 
    connect(m_ui->addEntryButton, SIGNAL(clicked()), mapper, SLOT(map())); 
    mapper->setMapping(m_ui->addEntryButton, 1); 
} 

編輯2:

更多代碼:

主營:

#include "todolister.h" 
#include <QtWidgets/QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    TodoLister w; 
    w.show(); 
    return a.exec(); 
} 

到doLister(.H):

class TodoLister : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    TodoLister(QWidget *parent = 0); 
    ~TodoLister(); 

private: 
    Ui::TodoListerClass ui; 
}; 

TodoLister(的.cpp):

TodoLister::TodoLister(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 
    UIController uiController(ui); 
} 
+0

我不確定這會有所作爲,但是有沒有特別的原因讓你使用'std :: shared_ptr'而不是'QSharedPointer'?爲了簡單起見,如果您確實需要在堆上實例化它,您甚至可以將您的'QSignalMapper'實例作爲成員對象,或者傳遞一個'QObject'的實例作爲父對象。而且可以肯定的是,如果您將映射器創建爲堆棧中的成員變量而不是使用堆,它會起作用嗎?有沒有任何控制檯輸出? (由於插槽使用後期綁定問題通常會在運行時檢測到併發布) – Murphy

+0

@Murphy我試圖使用正常的QSignalMapper *以及現在 - 作爲成員變量 - 如Qt教程中所述,但它似乎並不改變一切。也沒有輸出。 – Sossenbinder

+0

@Sossenbinder是否設置了QSignalMapper的父級? – Ilya

回答

1
TodoLister::TodoLister(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    ui.setupUi(this); 
    UIController uiController(ui); 
} 

uiController對象超出範圍的構造函數返回的時候,所以不能之後發送信號,因爲它被刪除。

+0

Hooray,那真的工作了!我甚至沒有預料到錯誤會在那裏,但現在它可以工作。非常感謝您的耐心! – Sossenbinder

+0

@Sossenbinder不客氣 – Ilya

0

EDIT

您正在定義的共享指針堆棧中的,而不是在堆,因此,如果你可能在構造函數中聲明瞭它,變量在完成時會被刪除,而不會在程序的其餘部分訪問。將其定義爲類的私有變量。

OLD 在QSignalMapper的文檔,連接的例子是如下:

connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); 

,而你有signalMapper.get()。該參數對應於接收信號的對象,而不是對象的方法,因此您應該單獨嘗試signalMapper

這同樣適用於第一次連接,在那裏你指定的對象產生的信號signalMapper.get(),而不是signalMapper

+0

是的,這是真的,但比較了我使用智能指針的文檔,所以.get()只會返回作爲參數需要的原始指針 – Sossenbinder

+0

@Sossenbinder don'使用智能指針,使用父子關係 - 這更簡單。 – Ilya

+0

好吧,真@Sossenbinder,沒有看到。也許這是因爲你正在聲明堆棧中的共享指針(我猜是在構造函數中),所以當構造函數完成時,它會刪除智能指針。嘗試將智能指針聲明爲類的私有變量,這樣對象將在整個課程的整個生命週期中持續存在。 –