Как перенаправить qml console.log () в cpp stdout

Я использую 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 на консоль?

Заранее спасибо.

3

Решение

Вот Вы можете найти более подробное объяснение.

console.log просто qDebugНет разницы в конечном использовании. Ваш код должен работать, так что я думаю, вы просто не проверили его должным образом. Хотя ваш код кажется странным, потому что он неоправданно зависит от платформы.

Скорее всего, вы должны избавиться от этого.

Кстати, Qt 4 реализовывал нечто похожее на QML viewer. Вот Вы можете найти код для примера реализации, в сомнениях.

Надеюсь, мой ответ ответит на ваш вопрос. Если нет, пожалуйста, уточните.

3

Другие решения

Если вам нужен какой-нибудь журнал из исходного кода 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, которые пишут в ваш лог-файл, данные записываются.

4

Это тот же процесс что касается других сообщений Qt. Сообщение, отправленное console.log() достигнет обработчика сообщений Qt, который вы устанавливаете, с серьезностью QtDebugMsg.

2

использование QMLLogging. Это быстро, безопасно и многофункционально

Раскрытие информации: я являюсь автором этой библиотеки

2
По вопросам рекламы [email protected]