Sim*_*rta 2 logging qt qml qdebug qtquick2
Qt Quick 使用 qDebug执行日志记录,其中标准 Javascript 日志记录方法映射到 Qt 日志类型
console.log() -> qDebug()
console.debug() -> qDebug()
console.info() -> qDebug()
console.warn() -> qWarning()
console.error() -> qCritical()
Run Code Online (Sandbox Code Playgroud)
在这一点上,您失去了 debug() 和 info() 之间的区别。
有没有办法直接在 QML 引擎中为 Javascript 方法注册自定义记录器,而无需通过 qDebug 和qInstallMessageHandler?
虽然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" );
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
前两个按钮改变了,第三个按钮的作用是通过修改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 );
}
Run Code Online (Sandbox Code Playgroud)