我試圖用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);
}
我不確定這會有所作爲,但是有沒有特別的原因讓你使用'std :: shared_ptr'而不是'QSharedPointer'?爲了簡單起見,如果您確實需要在堆上實例化它,您甚至可以將您的'QSignalMapper'實例作爲成員對象,或者傳遞一個'QObject'的實例作爲父對象。而且可以肯定的是,如果您將映射器創建爲堆棧中的成員變量而不是使用堆,它會起作用嗎?有沒有任何控制檯輸出? (由於插槽使用後期綁定問題通常會在運行時檢測到併發布) – Murphy
@Murphy我試圖使用正常的QSignalMapper *以及現在 - 作爲成員變量 - 如Qt教程中所述,但它似乎並不改變一切。也沒有輸出。 – Sossenbinder
@Sossenbinder是否設置了QSignalMapper的父級? – Ilya