捕获QML错误消息

时间:2016-06-27 08:39:14

标签: qt try-catch qml

我正在使用Qt.createQmlObject()从文件创建QML对象。在文件损坏的情况下,QML会输出如下所示的消息:

Qt.createQmlObject(): failed to create object: qrc:/graphics/inline:5:2: Expected token}“`

我想抓住这条消息,告诉用户他的文件已损坏。

我正在尝试使用Qt.createQmlObject()中提供的第三个参数,但我不明白它是如何工作的。维基很好地描述了这个功能,但没有给出任何利用它的例子:

https://wiki.qt.io/QML_Dynamic_Objects#Creation_of_Dynamic_QML_Objects

  

第三个参数是在Qt Creator IDE中用作错误报告中的文件名的字符串。例如,如果在加载的QML字符串中遇到错误,则在具有文件名名称的文件中将其报告为一个错误。在调用时,作为字符串的文件名必须用双引号括起来。

2 个答案:

答案 0 :(得分:7)

你需要使用" try-catch"阻止这样:

try {
        var newObject = Qt.createQmlObject('import QtQuick 2.0; Rectangle11 {color: "red"; width: 20; height: 20}',
                                       this,
                                       "dynamicSnippet1");
    } catch (error) {
        print ("Error loading QML : ")
        for (var i = 0; i < error.qmlErrors.length; i++) {
            print("lineNumber: " + error.qmlErrors[i].lineNumber)
            print("columnNumber: " + error.qmlErrors[i].columnNumber)
            print("fileName: " + error.qmlErrors[i].fileName)
            print("message: " + error.qmlErrors[i].message)
        }
    }

official documentation

中对此进行了描述

答案 1 :(得分:1)

从Qt 5开始,更通用的方法是安装自己的调试消息消息处理程序,如以下所述:

https://doc.qt.io/qt-5/qtglobal.html#qInstallMessageHandler

然后您可以在自己的消息处理程序中放置一个断点。

这样做的优点是,它适用于Qt.createQmlObject以外的方案,例如当不涉及您自己的C ++的用户操作触发警告时。