我正在使用qml(qtCreator)和cpp(visual studio)。
通常,错误消息会显示在控制台上,包括cpp和qml。
我的要求是我不应该有控制台。
所以我写了一个窗口应用程序。
但是当设置了一个标志时,我应该启动一个控制台。并在那里显示相应的错误消息。
我在函数中使用了以下代码来设置它。
HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long) handle_out, _O_TEXT);
FILE* hf_out = _fdopen(hCrt, "w");
setvbuf(hf_out, NULL, _IONBF, 128);
// redirecting the buffers to the file handle
*stdout = *hf_out;
*stderr = *hf_out;
//attach std input to console
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
hCrt = _open_osfhandle((long) handle_in, _O_TEXT);
FILE* hf_in = _fdopen(hCrt, "r");
setvbuf(hf_in, NULL, _IONBF, 128);
*stdin = *hf_in;
这会将错误日志从stdout和stderr打印到控制台。
要重定向我们可以使用的qt错误日志。
How to redirect qDebug, qWarning, qCritical etc output?
但是我们如何将qml的console.log()的输出重定向到控制台。
提前致谢。
答案 0 :(得分:4)
如果您需要来自QML源代码的一些日志,您可以创建自己的Logger QML对象。此对象将使用您的C ++日志记录系统来记录您想要的位置和您喜欢的级别。要实现此结果,首先要创建一个继承自QQuickItem
的C ++类,例如:
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引擎,然后我们必须使用QQmlEngine
类中的模板函数qmlRegisterType。进入主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方法,在日志文件中写入记录的数据。
答案 1 :(得分:3)
Here你可以找到更详细的解释。
console.log
只是qDebug
,最终用途没有区别。你的代码应该有用,所以我猜你还没有正确测试它。虽然,你的代码似乎很奇怪,因为它是不必要的平台特定的。
可能你应该摆脱它。
顺便说一句,Qt 4正在实现与QML查看器类似的东西。 Here您可以找到实施示例的代码,但仍有疑问。
希望,我的回复回答了你的问题。如果没有,请澄清。
答案 2 :(得分:2)
与其他Qt消息一样,same process。 console.log()
发出的消息将到达您使用QtDebugMsg严重性安装的Qt消息处理程序。
答案 3 :(得分:2)
使用QMLLogging。它快速,类型安全且功能丰富
披露:我是这个图书馆的作者