Обработка ошибок в коде C приложения QML

#c #qt #qml #qt5

#c #qt #qml #qt5

Вопрос:

Я работаю над проектом, который включает в себя интерфейс QML и тяжелую логику C . Большинство частей нашей кодовой базы используют исключения C для обработки ошибок. И мой главный вопрос заключается в том, как я могу автоматизировать перевод этих исключений C в ошибки QML?

Единственная релевантная ссылка, которую я нашел, — это глобальная обработка исключений с помощью c / QML, в которой просто указано, что нужно передавать ошибки в виде возвращаемых значений вручную. Или оберните их блоками try-catch на стороне QML, опять же вручную.

Еще несколько деталей и контекста.

Когда я работал над приложением на основе QWidgets, я мог просто переопределить QCoreApplication::notify и обрабатывать все необработанные ошибки в противном случае. Что касается движка QML, он, похоже, не является нейтральным к исключениям. Разматывание стека через него приводит к нарушениям доступа и другим неприятным ошибкам во время выполнения. И, похоже, нет точки расширения, подобной QCoreApplication::notify . Ближайшие функции QQmlObjectOrGadget::metacall и static CallMethod qv4qobjectwrapper.cpp:1270 функции скрыты глубоко в реализации и не могут быть расширены без исправления Qt.

В документации QML также предлагается QJSEngine::throwError как способ создания исключений QML из кода C . Проблема в том, что для этого требуется экземпляр движка QML, который можно получить через QQmlEngine::contextForObject (...)->engine() или qmlEngine. Который может использоваться только для объектов, обрабатываемых QML. Поэтому, если вы вызываете произвольный Q_INVOKABLE метод для объекта C , доступного Qt, у вас нет простого доступа к QQmlEngine экземпляру.

Последняя часть, которая захватывает необработанные исключения QML, кажется более управляемой с помощью сигнала QQmlEngine::warnings .