在SLOT内动态调用函数

时间:2014-12-18 13:15:45

标签: c++ qt function parameter-passing slot

我想将函数发送到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(&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, &QPushButton::released, this, fptr);
}

2 个答案:

答案 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只是一个预处理器宏,它将其参数转换为字符串,并在其SLOTSIGNAL(以及调试模式下的调试信息)中添加一个标志。所以,如果你写

connect(button, SIGNAL(released()), this, SLOT(fptr));

它没有传递变量fptr的内容,只是把它变成文本“1fptr”,那个插槽显然不存在。