Skip to main content

Raymii.org Raymii.org Logo

Quis custodiet ipsos custodes?
Home | About | All pages | Cluster Status | RSS Feed | Gopher

Log all Item properties and functions in Qml

Published: 09-02-2022 | Author: Remy van Elst | Text only version of this article


Table of Contents


This small snippet of Javascript logs all properties and functions of a Qml Item. This is useful when you're knees-deep in a dynamic control that has a model and you're wondering why your code does not work. Probably because you're not using the correct property name. Or at least, that is something I often have. Logging all properties or functions helps to figure out that issue.

I'm developing a desktop monitoring app, Leaf Node Monitoring, open source, but paid. For Windows, Linux & Android, go check it out.

Consider sponsoring me on Github. It means the world to me if you show your appreciation and you'll help pay the server costs.

You can also sponsor me by getting a Digital Ocean VPS. With this referral link you'll get $100 credit for 60 days.

demo program

A demo program that logs functions and properties to the command line and a TextArea

The code to log all properties is actually very simple:

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

Same goes for logging all functions:

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

If you remove the if(typeof... then you get both in the output.

Usage is simple, just pass the id: of an item you want to log:

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

You could also use JSON.stringify() but I have seen recursive loops that crashed when using that, so this is my small goto snippet.

Demo Qml Program

Here's a small Qml demo program that logs either functions or properties to the command line and a TextArea.

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();
}
Tags: c++ , cpp , debugging , javascript , qml , qt , qt5 , snippets