[Development] Types defined in c++ plugin aren't available in QML code
Todd.Rose at nokia.com
Todd.Rose at nokia.com
Mon Jan 16 18:51:27 CET 2012
Hi,
I think your example.qml needs to import the library that contains your custom C++ type...so in your scenario it would be something like "import myplugin 1.0".
Best regards,
Todd
________________________________
From: development-bounces+todd.rose=nokia.com at qt-project.org [development-bounces+todd.rose=nokia.com at qt-project.org] on behalf of ext Łukasz Korbel [korbel85 at gmail.com]
Sent: Monday, January 16, 2012 12:35 PM
To: development at qt-project.org
Subject: [Development] Types defined in c++ plugin aren't available in QML code
Hello,
I have problem with using c++ defined types in QML code. Qt version i use is Qt 5.0 built from git repository.
Problem:
I wrote simple project in Qt 4.7 according to guidelines from http://doc.qt.nokia.com/qt5/qml-extending.html and http://doc.qt.nokia.com/qt5/src-imports-folderlistmodel.html.
Next I made transition from Qt.4.7 to 5.0. ( http://wiki.qt-project.org/Transition_from_Qt_4.x_to_Qt5)
Building of project is going succesful but running qmlscene example.qml returns error
that MyType(the one I've created) is not a type.
Details of project:
MyType is C++ class meeting following conditions:
1. Inherit from QObject
2. Use Q_OBJECT macro in body and QML_DECLARE_TYPE macro in header file
3. MyType is registered with qmlRegisterType in MyPlugin class
MyPlugin class (in MyPlugin.cpp) inherits from QDeclarativeExtensionPlugin, defines void registerTypes(const char *uri) method and have Q_EXPORT_PLUGIN2 macro in file.
Listing:
----------------------------------------------------------------------------------------------------------------------------------
MyType.h
----------------------------------------------------------------------------------------------------------------------------------
#ifndef MYTYPE_H
#define MYTYPE_H
#include <QObject>
#include <QtDeclarative>
#include <QString>
QT_BEGIN_HEADER
QT_MODULE(Declarative)
class MyType : public QObject
{
Q_OBJECT
Q_PROPERTY( QString data READ data WRITE setData NOTIFY dataChanged)
public:
MyType();
~MyType();
QString data() const;
void setData( const QString&);
Q_INVOKABLE void performAlogrithm();
Q_SIGNALS:
void dataChanged();
private:
Q_DISABLE_COPY(MyType);
QString data_;
};
QML_DECLARE_TYPE(MyType)
QT_END_HEADER
#endif
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
MyType.cpp
----------------------------------------------------------------------------------------------------------------------------------
#include "MyType.h"
MyType:: MyType()
{
data_ = "init";
}
MyType:: ~MyType()
{
data_ = "destroy";
}
QString MyType:: data() const
{
return data_;
}
void MyType:: setData( const QString& data)
{
data_ = data;
}
void MyType:: performAlogrithm()
{
//do something
emit dataChanged();
}
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
MyPlugin.cpp
----------------------------------------------------------------------------------------------------------------------------------
#ifndef MYPLUGIN
#define MYPLUGIN
#include <QDeclarativeExtensionPlugin>
#include <qdeclarative.h>
#include "MyType.h"
class MyPlugin : public QDeclarativeExtensionPlugin
{
Q_OBJECT
public:
void registerTypes(const char *uri)
{
qmlRegisterType<MyType>(uri, 1, 0, "MyType");
}
};
#include "MyPlugin.moc"
Q_EXPORT_PLUGIN2(myplugin, QT_PREPEND_NAMESPACE(MyPlugin));
#endif
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
project.pro<http://project.pro>
----------------------------------------------------------------------------------------------------------------------------------
TEMPLATE = lib
CONFIG += qt plugin release
QT += declarative
HEADERS += MyType.h
SOURCES += MyType.cpp MyPlugin.cpp
TARGET = $$qtLibraryTarget(myplugin)
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
qmldir
----------------------------------------------------------------------------------------------------------------------------------
plugin myplugin
----------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------
example.qml
----------------------------------------------------------------------------------------------------------------------------------
import QtQuick 2.0
Item{
width: 200; height: 50
MyType{
id: myObject
data: "nothing smart"
onDataChanged: console.log( myObject.data)
}
MouseArea{
onClicked: myObject.performAlgorithm()
}
}
----------------------------------------------------------------------------------------------------------------------------------
>qmlscene example.qml
Error: example.qml:7:2: MyType is not a type
MyType{
Whole project is built using qmake from Qt5. Qmake complains about lack of quick module but adding it doesnt solve the problem. I also tried relase and debug version of plugin - same result. There's no problem for QML to detect types in qml files, it affects only c++ plugins.
I will appreciate any suggestions how to solve this problem.
Thank you in advance,
Łukasz Korbel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/development/attachments/20120116/97c75dd5/attachment.html>
More information about the Development
mailing list