Protokollieren Sie alle Elementeigenschaften und -funktionen in Qml

Protokollieren Sie alle Elementeigenschaften und -funktionen in Qml

Dieses kleine Javascript-Snippet protokolliert alle Eigenschaften und Funktionen eines Qml-Elements. Dies ist nützlich, wenn Sie knietief in einem dynamischen Steuerelement mit einem Modell stecken und sich fragen, warum Ihr Code nicht funktioniert. Wahrscheinlich, weil Sie nicht den richtigen Eigenschaftsnamen verwenden. Zumindest habe ich das oft. Das Protokollieren aller Eigenschaften oder Funktionen hilft, dieses Problem zu lösen.

Der Code zum Protokollieren aller Eigenschaften ist eigentlich sehr einfach:

function listProperties(item) {
    var properties = ""
    for (var p in item)
        if (typeof item[p] != "function")
            properties += (p + ": " + item[p] + "\n")
    return properties
}

Gleiches gilt für die Protokollierung aller Funktionen:

function listFunctions(item) {
    var functions = ""
    for (var f in item)
        if (typeof item[f] == "function")
            functions += (f + ": " + item[f] + "\n")
    return functions
}

Wenn Sie den if(typeof... entfernen dann bekommst du beides in der ausgabe.

Die Verwendung ist einfach, geben Sie einfach die id: weiter eines Elements, das Sie protokollieren möchten:

Button {
    id: logButton
    [...]
    text: "Log Properties"
    onClicked: {
        console.log(listProperties(logButton))
    }
}

Sie können auch JSON.stringify() verwenden aber ich habe rekursive Schleifen gesehen, die bei der Verwendung abgestürzt sind, also ist dies mein kleiner Goto-Snippet.

QML-Demoprogramm

Hier ist ein kleines Qml-Demoprogramm, das entweder Funktionen oder Eigenschaften in der Befehlszeile und einem TextArea protokolliert .

main.qml

import QtQuick 2.15
import QtQuick.Controls 2.12
import QtQuick.Window 2.15

Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Log Properties Example")

    function listProperties(item) {
        var properties = ""
        for (var p in item)
            if (typeof item[p] != "function")
                properties += (p + ": " + item[p] + "\n")
        return properties
    }

    function listFunctions(item) {
        var functions = ""
        for (var f in item)
            if (typeof item[f] == "function")
                functions += (f + ": " + item[f] + "\n")
        return functions
    }

    Button {
        id: logButton
        anchors.top: parent.top
        anchors.left: parent.left
        anchors.margins: 50
        objectName: "Raymii.org Example"
        text: "Log Properties"
        onClicked: {
            console.log(listProperties(logButton))
            logTextarea.text = listProperties(logButton)
        }
    }

    Button {
        id: logFunctionsButton
        anchors.top: parent.top
        anchors.left: logButton.right
        anchors.margins: 50
        text: "Log Functions"
        onClicked: {
            console.log(listFunctions(logFunctionsButton))
            logTextarea.text = listFunctions(logFunctionsButton)
        }
    }

    ScrollView {
        id: propertyview
        anchors.top: logButton.bottom
        anchors.left: parent.left
        anchors.margins: 50
        width: 500
        height: 300

        TextArea {
            id: logTextarea
            anchors.fill: parent
            placeholderText: "click the buttons"
        }
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>


int main(int argc, char *argv[])
{
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}