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() не блокирует Что происходит, это следующее:

  1. Вы создаете QMessageBox с локальным охватом.
  2. Вы показываете это.
  3. 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 и выше) языковые функции, такие как лямбда-выражения, и, следовательно, позволяет напрямую подключать сигнал / слот к любому функтору. Чтобы получить некоторую предысторию, посмотрите, например, этот пост в блоге.

Другие вопросы по тегам