Я пытался написать программу, используя 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.
Это работает на 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)
Ты можешь использовать endBox
QObject, чтобы сделать связь между QAbstractButton
«s clicked
сигнал и ваш exitToWin
простая функция Вы также не можете подключить SIGNAL к простой функции или лямбде, поэтому вместо этого мы используем разновидность функции-члена.
(2)
endBox на самом деле не получает кнопку ОК по умолчанию. Когда вы упоминаете об этом на линии (1)
в вашем коде он создает его, но не вовремя (по-видимому), чтобы передать указатель обратно connect
поэтому мы сначала создадим его здесь.
Ваш код не будет работать по двум причинам:
Во-первых, QMessageBox
нет такого сигнала. Увидеть документация для сигналов у него есть.
Во-вторых, при подключении к сигналу к слоту (или лямбда-функции) необходимо определить сигнатуры функций, а не конкретные значения.
Если сигнал может передавать различные значения, и вы хотите, чтобы ваш слот выполнял определенную функцию при выборе этих значений (в этом случае, только если значение QMessageBox::Ok
пропущено), до слота нужно запрашивать значения, а не connect
заявление.
Так как подключения () метод из QObject это должно быть вызвано из QObject ребенок, содержащий Q_OBJECT макрос в своем объявлении. Бег QMAKE подготовить класс для отправки сигналов и получения слотов.