Замените ведение журнала для console.debug() console.warn()

Qt Quick использует qDebug для ведения журнала, где стандартные методы ведения журнала Javascript отображаются на тип журнала Qt

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

На этом этапе вы теряете различие между debug() и info().

Есть ли способ зарегистрировать пользовательский регистратор для методов Javascript непосредственно в движке QML, не переходя через qDebug и qInstallMessageHandler?

1 ответ

Решение

Хотя globalObject доступен только для чтения в QQmlEngine, сохраненные в нем значения не являются. Таким образом, вы можете изменить консольное свойство globalObject. Вы можете сделать это как в 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 );
}
Другие вопросы по тегам