2014-12-18 5 views
1

Я хотел бы послать функции динамически в 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)); 
} 

Я пытался передать функцию в качестве параметра и получить его имя на основе указателя (который не представляет, как именно располагаются код здесь), но я не уверен, что это лучшее решение или даже решение. Кто-нибудь знает, если это возможно и как я могу это сделать?

Edited как указано на @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); 
} 
+1

На стороне узла: Какова ваша цель параметра 'button'? Вы не получаете адрес вновь созданного QPushButton в переменную 'loginButton/registerButton' области, в которой вы вызываете' buttonSetup'. Для этого вам нужно использовать '**'. И если вы не хотите использовать 'loginButton/registerButton' в этой области, то параметр бесполезен. – Slyps

+0

Вы правы, это сбой приложения –

ответ

4

Вы должны использовать новую синтаксис:

connect(button, &QPushButton::released, this, fptr); 
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», и этот слот явно не делает существует.