我尝试将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);
}
答案 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