如何报告来自自定义 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}");
我用一些 属性:
制作了一个 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}");