Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 如何报告来自自定义QML组件的错误?_Qt_Qml_Qtquick2 - Fatal编程技术网

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

Qt 如何报告来自自定义QML组件的错误?,qt,qml,qtquick2,Qt,Qml,Qtquick2,我制作了一个MyComponent QML组件,它具有一些属性: Q_PROPERTY(PendingList* list MEMBER list) 和一个函数: Q_INVOKABLE void send(); QQuickView view; m_engine = view.engine(); 它可以在QML中创建: MyComponent { id: myComponent } 当我在某个地方调用myComponent.send()而列表属性未定义时,如何在stderr中正

我制作了一个MyComponent QML组件,它具有一些属性:

Q_PROPERTY(PendingList* list MEMBER list)
和一个函数:

Q_INVOKABLE void send();
QQuickView view;
m_engine = view.engine();
它可以在QML中创建:

MyComponent {
    id: myComponent
}
当我在某个地方调用
myComponent.send()
列表
属性未定义时,如何在
stderr
中正确报告问题?我想查看调用
send()
的*.qml文件名和行号,或者查看创建
myComponent
的行号


有没有合适的方法可以获取QML堆栈跟踪或生成
QQmlError
或引发将由QML引擎处理的异常?

必须使用一些私有的东西

带幻灯片和代码的Git存储库:

短版 添加到
CMakeLists.txt

include_directories(${Qt5Quick_PRIVATE_INCLUDE_DIRS})
Q\u可调用的
函数或插槽中添加一些QV8引擎内容:

#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));
}
还可以将消息模式设置为实际显示行号(在
main.cpp
开头的某个地方可以):


必须使用一些私人物品

带幻灯片和代码的Git存储库:

短版 添加到
CMakeLists.txt

include_directories(${Qt5Quick_PRIVATE_INCLUDE_DIRS})
Q\u可调用的
函数或插槽中添加一些QV8引擎内容:

#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));
}
还可以将消息模式设置为实际显示行号(在
main.cpp
开头的某个地方可以):


您可以
qmlEngine(this)->评估引发异常的javascript片段,假设
this
是您的组件最终派生自
QObject
。它是qmlEngine的新实例吗?我认为它不会在该代码段之外显示任何行号。您可以
qmlEngine(this)->评估出现异常的javascript代码段,假设
this
是您的组件最终从
QObject
派生而来。它是qmlEngine的新实例吗?我认为它不会在代码片段之外显示任何行号。