我试图在按钮上使用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是该类的私有成员值。

编辑2:

由于需求,这是我的整个构造函数链:

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);
}

最佳答案

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


当构造函数返回时,您的uiController对象超出范围,因此以后不会发出信号,因为它已被删除。

关于c++ - QSignalMapper不会触发SLOT,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35973801/

10-15 00:55