QML ソース コードからのログが必要な場合は、独自の Logger QML オブジェクトを作成できます。このオブジェクトは、C++ ロギング システムを使用して、必要な場所と優先レベルでログを記録します。この結果を得るには、まず から継承する C++ クラスを作成しますQQuickItem
。次に例を示します。
QmlLogger.hpp
#include <QQuickItem>
class QmlLogger : public QQuickItem
{
Q_OBJECT
public:
explicit QmlLogger(QQuickItem *iParent = 0);
// Q_INVOKABLE log method will be called by Qml source.
Q_INVOKABLE void log(unsigned int iLogLevel, const QString& iDataToLog) const;
enum Level
{
Error = 0,
Warning,
Info,
Debug,
Trace
};
Q_ENUMS(Level)
private:
YourLogger mYourLogger; // YourLogger is your system to log on C++ world
};
QmlLogger.cpp
#include <QmlLogger.hpp>
// Your Constructor
// Implementation of log method callable from Qml source
void log(unsigned int iLogLevel, const QString& iDataToLog) const
{
switch(iLogLevel)
{
case Error: // ERROR
// use you logger to log iDataToLog at error level
break;
case Warning: // WARNING
// use you logger to log iDataToLog at warning level
break;
case Info: // INFO
// use you logger to log iDataToLog at info level
break;
case Debug: // DEBUG
// use you logger to log iDataToLog at debug level
break;
case Trace: // TRACE
// use you logger to log iDataToLog at trace level
break;
}
}
ここで、新しいオブジェクトを登録して QML エンジンで使用できるようにする必要があります。次に、クラスからテンプレート関数qmlRegisterTypeを使用する必要があります。QQmlEngine
たとえば、次のように、メインの Qt ループに入った後にこの関数を使用します。
int typeId = qmlRegisterType<QmlLogger>("QmlLogger", 1, 0, "Logger");
// if typeId is 0 => Error
Q_ASSERT(typeId);
C++ では完了です。QMLソースでは、この簡単な方法で新しいオブジェクトを使用できます
import QmlLogger 1.0
Logger{
id: logger
}
function aFunctionThatYouWantToDebug(iArgumentOne, iArgumentTwo){
// logging
logger.log(Logger.Debug, "Entering function aFunctionThatYouWantToDebug(" + iArgumentOne + ", " + iArgumentTwo + ")")
// body of function ...
}
QML ソースで log メソッドを呼び出すことは、C++ クラスQmlLogger
で log メソッドを呼び出すことと同等であり、ログ ファイルに記録されたデータを書き込みます。