我试图在按钮上使用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/