QSignalMapper不会触发SLOT

时间:2016-03-13 18:05:12

标签: c++ qt

我尝试将QSignalMapper用于我的按钮,但我似乎无法让它用于触发我的广告位。

这是我的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);

两个连接都返回true作为值,因此应正确设置连接。但是,此插槽根本没有被触发:

public slots:

    void HandleSignalEvents(int);

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

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

我没有得到任何错误,所以我无法弄清楚问题是什么。两个连接似乎都像往常一样工作,但动作不会触发。

这里可能出现什么问题?

编辑:

请注意,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();
}

TodoLister(.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);
}

2 个答案:

答案 0 :(得分:1)

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

当构造函数返回时,uiController对象超出范围,因此无法在之后发出信号,因为它已被删除。

答案 1 :(得分:0)

修改

您正在堆栈中定义共享指针,而不是在堆中,因此如果您可能在构造函数中声明它,则变量将在完成时被删除,而不是可以通过程序的其余部分访问。将其定义为类的私有变量。

<强> OLD 在QSignalMapper的文档中,connect的示例如下:

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

虽然你有signalMapper.get()。该参数对应于接收信号的OBJECT,而不是对象的方法,因此您应该单独尝试signalMapper

同样适用于第一次连接,您已指定生成信号的OBJECT为signalMapper.get(),而不是signalMapper