我想将函数发送到SLOT - 我的想法是使用相同的按钮设置(使代码重用)但使用不同的处理程序:
函数调用:
buttonSetup(loginButton, "Login", 100, 200, 100, 25, &KHUB::handleLogin);
buttonSetup(registerButton, "Register", 225, 200, 100, 25, &KHUB::handleRegister);
功能设置:
void KHUB::buttonSetup(QPushButton *button, const QString name, int posX, int posY, int width, int height, void(KHUB::*fptr)())
{
button = new QPushButton(name, this);
button->setGeometry(QRect(QPoint(posX, posY), QSize(width, height)));
//Event Listener
connect(button, SIGNAL(released()), this, SLOT(fptr));
}
我试图将该函数作为参数传递,并根据指针获取其名称(这并不能完全代表代码在这里的处理方式),但我不确定这是否是最佳解决方案甚至解决方案。有谁知道这是否可行,我怎么能做到这一点?
按@Slyps [工作代码]的指示编辑:
函数调用:
buttonSetup(&loginButton, "Login", 100, 200, 100, 25, &KHUB::handleLogin);
buttonSetup(®isterButton, "Register", 225, 200, 100, 25, &KHUB::handleRegister);
功能设置:
void KHUB::buttonSetup(QPushButton **button, const QString name, int posX, int posY, int width, int height, void(KHUB::*fptr)())
{
*button = new QPushButton(name, this);
(*button)->setGeometry(QRect(QPoint(posX, posY), QSize(width, height)));
//Event Listener
connect(*button, &QPushButton::released, this, fptr);
}
答案 0 :(得分:4)
您需要使用更新的语法:
connect(button, &QPushButton::released, this, fptr);
答案 1 :(得分:4)
使用较新的语法,例如ratchetfreaks的答案,或者,对于传统的语法:
buttonSetup(loginButton, "Login", 100, 200, 100, 25, SLOT(handleLogin));
buttonSetup(registerButton, "Register", 225, 200, 100, 25, SLOT(handleRegister));
void KHUB::buttonSetup(QPushButton *button, const QString name, int posX, int posY, int width, int height, const char * slot)
{
button = new QPushButton(name, this);
button->setGeometry(QRect(QPoint(posX, posY), QSize(width, height)));
//Event Listener
connect(button, SIGNAL(released()), this, slot);
}
SLOT
只是一个预处理器宏,它将其参数转换为字符串,并在其SLOT
或SIGNAL
(以及调试模式下的调试信息)中添加一个标志。所以,如果你写
connect(button, SIGNAL(released()), this, SLOT(fptr));
它没有传递变量fptr
的内容,只是把它变成文本“1fptr”,那个插槽显然不存在。