我试图在按钮上使用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:
更多代码:
Main:
#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);
}发布于 2016-03-15 17:30:11
TodoLister::TodoLister(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
UIController uiController(ui);
}当构造函数返回时,您的uiController对象就超出了作用域,所以以后不能发出信号,因为它被删除了。
发布于 2016-03-13 18:13:50
编辑
您是在堆栈中定义共享指针,而不是在堆中,因此如果您可能在构造函数中声明了共享指针,则该变量在完成时将被删除,无法在程序的其余部分中访问。将其定义为类的私有变量。
旧在QSignalMapper文档中,连接的示例如下:
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));而您有signalMapper.get()。该参数对应于接收信号的对象,而不是对象的方法,因此应该单独尝试signalMapper。
这同样适用于第一个连接,您已经将生成信号的对象指定为signalMapper.get(),而不是signalMapper。
https://stackoverflow.com/questions/35973801
复制相似问题