Замените ведение журнала для 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 );
}