替换console.debug()console.warn()的日志记录后端

时间:2014-11-13 13:04:32

标签: qt logging qml qtquick2 qdebug

Qt Quick uses qDebug执行日志记录,标准Javascript日志记录方法被绑定到Qt日志类型

console.log()   -> qDebug()
console.debug() -> qDebug()
console.info()  -> qDebug()
console.warn()  -> qWarning()
console.error() -> qCritical()

此时你松开了debug()和info()之间的区别。

有没有办法直接在QML引擎中为Javascript方法注册自定义记录器,而无需通过qDebug和qInstallMessageHandler

1 个答案:

答案 0 :(得分:4)

虽然 globalObject QQmlEngine 中是只读的,但其中存储的值不是。因此,您可以修改 globalObject console 属性。你可以用C ++和QML来做到这一点。这是QML中一个简单的运行示例:

import QtQuick 2.3
import QtQuick.Controls 1.2

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Console example")

    Column {
        anchors.centerIn: parent

        Button {
            text: "debug"
            onClicked: {
                console.log = console.debug
            }
        }

        Button {
            text: "exception"
            onClicked: {
                console.log = console.exception
            }
        }

        Button {
            text: "print something"
            onClicked: {
                console.log( "logging something" );
            }
        }
    }
}

前两个按钮更改,第三个按钮通过修改 console.log 方法执行的操作。 C ++看起来像这样(我不能在这里复制我的所有代码,对不起,但它应该让你去,它运作良好):

// in a header file
class HelperObject: public QObject {
    Q_OBJECT
    // ...
    public slots:
        myLog( QString aMessage );
};

// in an implementation file
QQmlEngine   qmlEngine;
HelperObject helperObject;
QJSValue     helperValue = qmlEngine.newQObject( &helperObject );
QJSValue     consoleObject( qmlEngine.globalObject().property( "console" ) );

if (!consoleObject.isUndefined()) {
    QJSValue myLogValue = helperValue.property( "myLog" );

    consoleObject.setProperty( "log", myLogValue );
}