Qt перехватывает Application :: exec в классе приложения? - PullRequest
7 голосов
/ 01 июля 2011

Есть ли какой-нибудь способ, чтобы функция в моем классе приложения (производная от QApplication) вызывалась при вызове QCoreApplication::exec()? Я не вижу никаких сигналов или событий, которые генерируются непосредственно перед запуском цикла сообщений.

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

В настоящее время я просто отправляю в очередь сигнал из конструктора приложения, который затем обрабатывается после запуска цикла событий. Мне просто интересно, есть ли более четкий способ перехвата exec?

1 Ответ

1 голос
/ 18 декабря 2011

это старая техника в графических приложениях, но она может работать для вас.

используйте QObject::startTimer(0), затем переопределите QObject :: timerEvent (), чтобы получить various components that rely on a fully constructed application object. Таким образом, various components that rely on a fully constructed application object будет создан только после запуска цикла событий.

небольшое пояснение: QObject :: startTimer (int ms ) - это функция, которая запускает таймер в миллисекундах, который срабатывает каждые мс . Если вы передаете «0» в качестве аргумента, он срабатывает, как только начинается цикл обработки событий. как только он срабатывает, он вызывает QObject :: timerEvent () в том же классе, который был вызван QObject :: startTimer (). убедитесь, что вы остановили таймер с помощью QObject :: killTimer () внутри повторной реализации QObject :: timerEvent (), иначе таймер сработает бесконечно.

но @Mat имеет смысл, то, что цикл обработки событий не начался, не означает, что приложение QCoreApplication построено не полностью. Попробуйте взглянуть на это.

{
  QApplication app(argc, argv); //this is already a fully contructed QApplication instance
  MyClass *myObject = new MyClass; //this relies on a fully constructed QApplication instance

  return app.exec(); //this starts the event loop as you already know.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...