如何报告来自自定义 QML 组件的错误?

How to report errors from custom QML components?

我用一些 属性:

制作了一个 MyComponent QML 组件
Q_PROPERTY(PendingList* list MEMBER list)

和一个函数:

Q_INVOKABLE void send();

可以在QML中创建:

MyComponent {
    id: myComponent
}

当我在某处调用 myComponent.send()list 属性 未定义时,我如何才能在 stderr 中正确报告问题?我想查看调用 send() 的 *.qml 文件名和行号或 myComponent 创建的行号。

是否有可能获取 QML 堆栈跟踪或生成 QQmlError 或抛出将由 QML 引擎处理的异常的正确方法?

将不得不使用一些私人的东西。

QTDD14 - Categorized logging in QML - Giuseppe D'Angelo

Git 包含幻灯片和代码的存储库:qmllogging

精简版

添加到CMakeLists.txt:

include_directories(${Qt5Quick_PRIVATE_INCLUDE_DIRS})

向您的 Q_INVOKABLE 函数或插槽添加一些 QV8Engine 内容:

#include <QtQml>

#include <private/qv4engine_p.h>
#include <private/qv8engine_p.h>

void Logger::log(const QString &message)
{
    const QV4::StackFrame frame = QV8Engine::getV4(m_engine)->currentStackFrame();

    QMessageLogger(qPrintable(frame.source),
                   frame.line,
                   qPrintable(frame.function)).warning("%s", qPrintable(message));
}

获取该功能的引擎:

QQuickView view;
m_engine = view.engine();

同时设置消息模式以实际显示行号(在 main.cpp 开头的某处可以):

qSetMessagePattern("%{file}:%{line} - %{message}");