Я использую 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 мы можем использовать.
Как перенаправить вывод qDebug, qWarning, qCritical и т. Д.?
Но как нам перенаправить вывод из console.log () из qml на консоль?
Заранее спасибо.
Вот Вы можете найти более подробное объяснение.
console.log
просто qDebug
Нет разницы в конечном использовании. Ваш код должен работать, так что я думаю, вы просто не проверили его должным образом. Хотя ваш код кажется странным, потому что он неоправданно зависит от платформы.
Скорее всего, вы должны избавиться от этого.
Кстати, Qt 4 реализовывал нечто похожее на QML viewer. Вот Вы можете найти код для примера реализации, в сомнениях.
Надеюсь, мой ответ ответит на ваш вопрос. Если нет, пожалуйста, уточните.
Если вам нужен какой-нибудь журнал из исходного кода 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);
На С ++ мы закончили. Теперь в исходном коде 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 ...
}
Вызов метода log в источнике QML эквивалентен вызову метода log в классе C ++. QmlLogger
, которые пишут в ваш лог-файл, данные записываются.
Это тот же процесс что касается других сообщений Qt. Сообщение, отправленное console.log()
достигнет обработчика сообщений Qt, который вы устанавливаете, с серьезностью QtDebugMsg.
использование QMLLogging. Это быстро, безопасно и многофункционально
Раскрытие информации: я являюсь автором этой библиотеки