Указатель на прохождение функции - Что я делаю неправильно? - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть следующая функция, чтобы связать кнопку в файле пользовательского интерфейса с функцией в классе.

void Window::connectButton() {
    connect(ui->pushButton, SIGNAL(released()), this, SLOT(clear()));
}

Чего я действительно хочу добиться, так это связать кнопку с функцией в производном классе , Я не могу использовать функцию connect() выше, потому что не могу получить доступ к ui->pushButton из производного класса. В итоге я получил следующее:

void Window::connectButton(void (*func)(void)) {
    connect(ui->pushButton, SIGNAL(released()), this, SLOT(func()));
}

Если это полезно, эта функция реализована в производном классе следующим образом:

void Transmit::setWindow() {
    windowTitle();
    setWindowSize();

    connectButton(clear);
    //clear is a redefined function for the derived class
    //inherited from the Window class
}

Я продолжаю получать сообщение о том, что func не используется в функции connectButton(void (*)()), и func2 нельзя передать в connectButton(void (*)()).

Это мой первый эксперимент с указателями функций, так что любой может указать мне направление моих ошибок или, если это более жизнеспособно, лучший способ реализации кода.

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Чтобы связать сигнал с функцией, вам нужно использовать «Новый» синтаксис слота сигнала

void Window::connectButton(void (*func)(void)) {
    connect(ui->pushButton, &QPushButton::released, func);
}

Если вы хотите подключиться к функциям-членам, вы можете использовать лямбды. Самый простой способ поддержать это с помощью std::function

void Window::connectButton(std::function<void()> func) {
    connect(ui->pushButton, &QPushButton::released, func);
}
1 голос
/ 19 апреля 2020

Я понятия не имею, что такое func2, но более насущная проблема состоит в том, что макрос SLOT() в Qt на самом деле вообще не работает с указателями функций, но на самом деле он принимает func() в качестве константы символа.

Самым простым выходом будет перемещение макроса SLOT() в вызывающую функцию, например:

void Window::connectButton(const char* method) {
    connect(ui->pushButton, SIGNAL(released()), this, method);
}

void Transmit::setWindow() {
    connectButton(SLOT(clear()));
}

. Выше предполагается, что this в Window::connectButton() фактически ссылается на объект, который Вы хотите позвонить на clear(). В противном случае вы бы использовали:

void Window::connectButton(QObject* receiver, const char* method) {
    connect(ui->pushButton, SIGNAL(released()), receiver, method);
}

void Transmit::setWindow() {
    connectButton(myobject, SLOT(clear()));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...