如果您需要 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 引擎,然后我们必须使用类中的模板函数qmlRegisterTypeQQmlEngine
。在进入主 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++ 类中的 log 方法QmlLogger
,将数据写入日志文件中。