3

私はqml(qtCreator)とcpp(ビジュアルスタジオ)を使用しています。

通常、エラー メッセージは、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 などの出力をリダイレクトする方法は?

しかし、qml の console.log() からの出力をコンソールにリダイレクトするにはどうすればよいでしょうか。

前もって感謝します。

4

4 に答える 4

4

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 メソッドを呼び出すことと同等であり、ログ ファイルに記録されたデータを書き込みます。

于 2014-03-29T19:54:38.860 に答える
3

ここで、より詳細な説明を見つけることができます。

console.logあくまでもqDebug、最終用途に違いはありません。あなたのコードは機能するはずなので、適切にテストしていないだけだと思います。ただし、不必要にプラットフォーム固有であるため、コードは奇妙に見えます。

あなたはそれを取り除くべきである可能性があります。

ちなみに、Qt 4 は QML ビューアーで似たようなものを実装していました。ここでは、実装例のコードを見つけることができます。

私の返信があなたの質問に答えることを願っています。そうでない場合は、明確にしてください。

于 2013-08-23T22:51:16.803 に答える
3

他のQt メッセージと同じプロセスです。によってconsole.log()発行されたメッセージは、QtDebugMsg 重大度でインストールした Qt メッセージ ハンドラーに到達します。

于 2013-08-23T20:56:34.200 に答える
2

QMLLoggingを使用します。高速で、タイプセーフで、機能が豊富です

開示:私はこのライブラリの作成者です

于 2014-03-31T00:46:13.450 に答える