Qt 5.3 Сигналы и слоты, простая функция и лямбда-выражение

Я пытался написать программу, используя Qt 5.3, и я стараюсь использовать сигналы и слоты на практике. Я написал следующий код (часть кода):

void exitToWin()
{
exit(0);
}
int main(int argc, char *argv[])
{

QApplication a(argc, argv);
MainWindow w;
QMessageBox EndBox;
QObject::connect((EndBox.button(QMessageBox::Ok)),SIGNAL(clicked()),exitToWin);
w.show();
EndBox.show();
return a.exec();
}

Я даже изменить объявление функции на static и я проверил выражение с круглыми скобками и без них, пока я пишу connect команда. но хотя то, что задокументировано в Qt и на что направлена ​​его IDE. также я читаю Вот и я проверил это.
Кроме того, я попробовал с лямбда-выражением, как показано ниже:

QObject::connect((EndBox.button(QMessageBox::Ok)),SIGNAL(clicked()),[=](){
exit(0);
});

но все равно я получаю сообщение об ошибке «Нет соответствующего вызова функции».
И в конце концов я должен сказать, что я использую Microsoft Windows 7.

2

Решение

Это работает на Qt 5.3:

#include <QtWidgets>

void exitToWin()
{
exit(0);
}

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QMainWindow w;
QMessageBox endBox;
endBox.addButton(QMessageBox::Ok); // (2)
endBox.connect(endBox.button(QMessageBox::Ok),
&QAbstractButton::clicked, exitToWin); // (1)
/* This works, too:
endBox.connect(endBox.button(QMessageBox::Ok),
&QAbstractButton::clicked,
[] () { exit(0); });
*/
w.show();
endBox.show();
return a.exec();
}

Вот почему:

(1) Ты можешь использовать endBoxQObject, чтобы сделать связь между QAbstractButton«s clicked сигнал и ваш exitToWin простая функция Вы также не можете подключить SIGNAL к простой функции или лямбде, поэтому вместо этого мы используем разновидность функции-члена.

(2) endBox на самом деле не получает кнопку ОК по умолчанию. Когда вы упоминаете об этом на линии (1) в вашем коде он создает его, но не вовремя (по-видимому), чтобы передать указатель обратно connectпоэтому мы сначала создадим его здесь.

4

Другие решения

Ваш код не будет работать по двум причинам:

Во-первых, QMessageBox нет такого сигнала. Увидеть документация для сигналов у него есть.

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

Если сигнал может передавать различные значения, и вы хотите, чтобы ваш слот выполнял определенную функцию при выборе этих значений (в этом случае, только если значение QMessageBox::Ok пропущено), до слота нужно запрашивать значения, а не connect заявление.

0

Так как подключения () метод из QObject это должно быть вызвано из QObject ребенок, содержащий Q_OBJECT макрос в своем объявлении. Бег QMAKE подготовить класс для отправки сигналов и получения слотов.

-1
По вопросам рекламы [email protected]