首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSignalMapper不触发插槽

QSignalMapper不触发插槽
EN

Stack Overflow用户
提问于 2016-03-13 18:05:11
回答 2查看 232关注 0票数 0

我试图在按钮上使用QSignalMapper,但是我似乎无法让它工作来触发我的插槽。

下面是我的SignalMapper代码:

在我的头上:

代码语言:javascript
复制
...
private:

    QSignalMapper *mapper;

在我的cpp中:

代码语言:javascript
复制
//Constructor:
mapper = new QSignalMapper(this);

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

下面是将我的按钮连接到它的代码:

代码语言:javascript
复制
connect(m_ui->addEntryButton, SIGNAL(clicked()), mapper, SLOT(map()));
mapper->setMapping(m_ui->addEntryButton, 1);

两个连接都以值形式返回true,因此应该正确设置连接。但是,根本没有触发这个插槽:

代码语言:javascript
复制
public slots:

    void HandleSignalEvents(int);

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

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

我没有任何错误,所以我不知道问题是什么。这两个连接似乎都正常工作,但操作不会触发。

这里怎么可能出问题了?

编辑:

注意,m_signalMapper是类的私有成员值。

EDIT2:

由于需求,下面是我的整个构造器链:

代码语言:javascript
复制
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:

更多代码:

Main:

代码语言:javascript
复制
#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):

代码语言:javascript
复制
class TodoLister : public QMainWindow
{
    Q_OBJECT

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

private: 
    Ui::TodoListerClass ui;
};

TodoLister(.cpp):

代码语言:javascript
复制
TodoLister::TodoLister(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    UIController uiController(ui);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-15 17:30:11

代码语言:javascript
复制
TodoLister::TodoLister(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    UIController uiController(ui);
}

当构造函数返回时,您的uiController对象就超出了作用域,所以以后不能发出信号,因为它被删除了。

票数 1
EN

Stack Overflow用户

发布于 2016-03-13 18:13:50

编辑

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

在QSignalMapper文档中,连接的示例如下:

代码语言:javascript
复制
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));

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

这同样适用于第一个连接,您已经将生成信号的对象指定为signalMapper.get(),而不是signalMapper

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35973801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档