QMessageBox не отображается
Всякий раз, когда я нажимаю 2, оно не показывает окно сообщения, хотя оно появляется, но не вызывает функцию msg().
Я звоню из слота:
Изменить: необходимый код ниже:
void msg()
{
QMessageBox msgBox;
msgBox.setText("Pressed 2!!!");
msgBox.show();
msgBox.exec();
}
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QPushButton *two = new QPushButton("2");
QObject::connect(two, SIGNAL(clicked()),&app,SLOT(msg()));
two->show();
return app.exec();
}
Я перепробовал все методы, но все еще не работает. Как положить всю функцию в слот и все.
1 ответ
Проблема в том, что show()
не блокирует Что происходит, это следующее:
- Вы создаете
QMessageBox
с локальным охватом. - Вы показываете это.
show()
немедленно возвращается и функция остается. Это уничтожит окно сообщения.
Самый простой способ, вероятно, будет использовать exec
вместо:
void msg()
{
QMessageBox msgBox;
msgBox.setText("Pressed 2!!!");
msgBox.exec(); // This blocks until the user closes the message box
}
Обновить:
Кроме того, ваш сигнал / слот неправильно настроен. Если вы хотите привязать сигнал нажатия кнопки к функции, используйте лямбда-выражение вроде этого:
QObject::connect(two, &QPushButton::clicked, []() { msg(); } );
или даже подключиться к функции напрямую:
QObject::connect(two, &QPushButton::clicked, &msg);
Обратите внимание, что вам все еще нужно переключиться на exec
вместо show
;-)
Фон в том, что при использовании SLOT()
вам необходимо указать слот (то есть метод) указанного вами объекта. Однако в настоящее время Qt поддерживает современные (C++11 и выше) языковые функции, такие как лямбда-выражения, и, следовательно, позволяет напрямую подключать сигнал / слот к любому функтору. Чтобы получить некоторую предысторию, посмотрите, например, этот пост в блоге.