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 nameHere 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();
}
@
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.0ApplicationWindow {
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 * marginColumnLayout { 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.