Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

set a property to a const QObject pointer C++ / QML



  • Hello,

    I'm trying to access a subclass element as a const pointer from QML (as I know I don't want to modify it from QML, just access const functions.. ). It seems to me that it should be a pretty normal workflow, but I can't find any working example and I can't get it to work.

    Here is a small example.

    main.cpp

        qmlRegisterType<MainClass>("Test", 1, 0, "MainClass");
        qmlRegisterUncreatableType<SubClass>( "Test", 1, 0, "Subclass", QStringLiteral("SubClass should not be created in QML")
        );
    

    MainClass.hpp

    MainClass {
        Q_OBJECT
        Q_PROPERTY( const SubClass* sub_element READ sub_element CONSTANT );
    public:
        const SubClass* sub_element() const { return &m_sub_element; }
    private:
       SubClass m_sub_element;
    }
    

    QML:

    import Test 1.0
    Rectangle {
        property MainClass element
        property SubClass sub_element : element.sub_element 
    } 
    

    Here everything is compiling. But when I run the code and try to call a function from sub_element I have the following error : ReferenceError: sub_element is not defined. If I remove the const everything is working fine, but I would rather not do that.

    If I remove the const from the Q_PROPERTY definition I obviously get a compilation error as I'm trying to convert a const element to a non const one.
    Changing the way I'm registering the SubClass doesn't seem to change anything (I've tried with/without const).

    I know I can go with a non const pointer but I would really like to understand why I should have such a limitation..