Problem adding a custom control Quick using QQmlApplicationEngine instance [solved]



  • I'm trying to add a simple custom control using one of the code examples; but I must be doing something wrong when trying to adding it to a QtQuickControls based QML .

    Output from running the app:
    QQmlApplicationEngine failed to load component
    qrc:/main.qml:78 Cannot assign to non-existent property "quickPluginCtrl"

    Error: Your root item has to be a Window.

    The qml editor kicks this out:
    Invalid property name

    Here is the code main.cpp:
    @#include <QtQml>
    #include <QtQuick/QQuickView>
    #include <QtCore/QString>

    #include <QtGui/QGuiApplication>
    #include "quickpluginctrl.h"

    int main(int argc, char *argv[])
    {
    QGuiApplication app(argc, argv);

    qmlRegisterType<quickPluginCtrl>("Charts", 1, 0, "quickPluginCtrl");
    
    
    QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
    QObject *topLevel = engine.rootObjects().value(0);
    QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
    if ( !window ) {
        qWarning("Error: Your root item has to be a Window.");
        return -1;
    }
    window->show();
    return app.exec&#40;&#41;;
    

    }
    @
    quickpluginctrl.cpp
    @#include "quickpluginctrl.h"

    quickPluginCtrl::quickPluginCtrl(QQuickItem *parent) :
    QQuickItem(parent)
    {
    }

    @

    file quickpluginctrl.h

    @#ifndef QUICKPLUGINCTRL_H
    #define QUICKPLUGINCTRL_H

    #include <QQuickItem>

    class quickPluginCtrl : public QQuickItem
    {
    Q_OBJECT
    public:
    explicit quickPluginCtrl(QQuickItem *parent = 0);

    signals:

    public slots:

    };

    #endif // QUICKPLUGINCTRL_H
    @

    main.qml
    @import QtQuick 2.1
    import QtQuick.Controls 1.0
    import QtQuick.Layouts 1.0
    import Charts 1.0

    ApplicationWindow {
    title: "Basic layouts"
    property int margin: 11
    width: mainLayout.implicitWidth + 2 * margin
    height: mainLayout.implicitHeight + 2 * margin
    minimumWidth: mainLayout.Layout.minimumWidth + 2 * margin
    minimumHeight: mainLayout.Layout.minimumHeight + 2 * margin

    ColumnLayout {
        id: mainLayout
        anchors.fill: parent
        anchors.margins: margin
        GroupBox {
            id: rowBox
            title: "Row layout"
            Layout.fillWidth: true
    
            RowLayout {
                id: rowLayout
                anchors.fill: parent
                TextField {
                    placeholderText: "This wants to grow horizontally"
                    Layout.fillWidth: true
                }
                Button {
                    text: "Button"
                }
            }
        }
    
        GroupBox {
            id: gridBox
            title: "Grid layout"
            Layout.fillWidth: true
    
            GridLayout {
                id: gridLayout
                rows: 3
                flow: GridLayout.TopToBottom
                anchors.fill: parent
    
                Label { text: "Line 1" }
                Label { text: "Line 2" }
                Label { text: "Line 3" }
    
                TextField { }
                TextField { }
                TextField { }
    
                TextArea {
                    text: "This widget spans over three rows in the GridLayout.\n"
                        + "All items in the GridLayout are implicitly positioned from top to bottom."
                    Layout.rowSpan: 3
                    Layout.fillHeight: true
                    Layout.fillWidth: true
                }
            }
        }
        TextArea {
            id: t3
            text: "This fills the whole cell"
            Layout.minimumHeight: 30
            Layout.fillHeight: true
            Layout.fillWidth: true
        }
        Item {
            id:tim
            Layout.minimumHeight: 150
            Layout.fillHeight: true
            Layout.fillWidth: true
    
            quickPluginCtrl
            {
                width: 100
                height: 100;
                id: ctrl
            }
    
            Text {
                anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
                text: "timmm"
            }
        }
    
        ProgressBar {
            id: progress_bar1
            x: 106
            y: 356
        }
    
        Slider {
            id: slider__horizontal_1
            x: 106
            y: 385
        }
    }
    

    }

    @



  • I know that this might not solve what you are trying to do but have you looked at the examples/docs for qtquick.window ?

    http://qt-project.org/doc/qt-5.0/qtquick/qquickwindow.html

    http://qt-project.org/doc/qt-5.0/qtquick/qmlmodule-qtquick-window2-qtquick-window-2.html



  • yes, trying to do it the same way. I was following the example for text (examples/quick/controls/text) and custom geometry. I was trying make a simple example based in a QQuickItem.

    Code compiles, etc.. but there is something basic I'm missing..



  • OK.. I went and added my QQuickItem to a working example, text and get the same issue:

    tarting /home/tcmichals/Qt/5.1.0/gcc_64/examples/quick/controls/build-text-Desktop_Qt_5_1_0_GCC_64bit-Debug/text...
    QML debugging is enabled. Only use this in a safe environment.
    QQmlApplicationEngine failed to load component
    qrc:/qml/main.qml:345 Cannot assign to non-existent property "vtyGraphQT"

    Error: Your root item has to be a Window.



  • I wonder if the object being returned to you is your pluginCtrl object. You should inspect it and see. If so, maybe you should loop over all the rootObjects until you find the one that casts successfully to QQuickWindow



  • OK that was a simple fix for some reason, qml requres the first letter to be capitalized for the name that is register to QML. Once I changed that, everything works.



  • Yes, all QML typenames must begin with a capital letter. The error that qmlRegisterObject() reports could be improved to make this obvious, I guess. Please file a bug report.

    Cheers,
    Chris.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.