Одна из программ, с которыми я работаю, имеет два режима, в которых она может работать: режим GUI (графический интерфейс пользователя) или режим CLI (интерфейс командной строки).Мы определяем, какой режим использовать с помощью аргумента командной строки (т. Е. Если передано «--cli», он будет использовать режим CLI).
Тип создаваемого экземпляра QApplication зависит от того, какой режим используется:QApplication должен использоваться для режима GUI, а QCoreApplication должен использоваться для режима CLI, потому что части GUI Qt не должны создаваться для режима CLI (так как режим CLI не использует или не нуждается в них).
Я могусделать это с помощью кода, подобного следующему:
std::unique_ptr<QCoreApplication> app =
(cliMode) ? std::make_unique<QCoreApplication>(argc, argv)
: std::make_unique<QApplication>(argc, argv);
// Do some other stuff...
return app->exec();
Поскольку я уже использую Qt, имеет смысл использовать QCommandLineParser для анализа моих аргументов.После разбора аргументов я хочу проанализировать их, чтобы определить, должны ли мы работать в режиме графического интерфейса или в режиме CLI.Тем не менее, это становится все труднее сделать.
Первая проблема, которую я заметил, была следующая в Linux (это не происходило в более старых версиях Qt5, но это происходит в более новых версиях):
$ ./myQtApplication --help
QCoreApplication::arguments: Please instantiate the QApplication object first
Segmentation fault (core dumped)
Хорошо: я больше не могу запускать команду --help
без создания экземпляра объекта QApplication.Я временно исправил это, вручную проанализировав аргументы, чтобы увидеть, является ли --help
аргументом.Если это так, продолжайте и создайте экземпляр QCoreApplication, проанализируйте аргументы и затем закройте.
Но затем я начал получать загадочную ошибку в Mac OS X. Когда я запускал исполняемый файл непосредственно в OS X, онбудет работать без проблем.Но если бы я попытался дважды щелкнуть файл .app
или ввести в терминале $ open myQtApplication.app
, я получил бы такую загадочную ошибку:
LSOpenURLsWithRole() failed with error -10810 for the file ./myQtApplication.app
Поскольку это довольно загадочная ошибка, мне потребовалосьДолгое время выяснялось, что эта ошибка была вызвана использованием QCommandLineParser до создания экземпляра объекта QApplication.
Чтобы исправить это, я сейчас делаю следующее:
- Вручную проанализируйте аргументы в начале функции
main()
, чтобы определить, была ли передана --cli
. - Создание объекта QApplication на основе результатов # 1.
- Запустите QCommandLineParserобработать остальные аргументы.
Это не очень чистый способ сделать это, потому что теперь у меня есть два парсера аргументов: один для определения, был ли передан --cli
, а остальные длядругие аргументы.
Есть ли гораздо лучший или "правильный" способ сделать это?
Полагаю, главный вопрос: могу ли я использовать QCommandLineParser, чтобы определить, создавать ли экземпляр объекта QCoreApplication или объект QApplication?