Calling c++ function from qml
-
i am trying to call a function from qml but i am getting following error in qml file:
result of expression cppClass.getmouseposition() [undefined] is not a function
in c++ file i written following code:
class A{ getmouseposition(){} };
A sample;
view.rootContext->setContextProperty("cppClass",&sample);please help me
-
Your method has to be either a slot or marked as Q_INVOKABLE. See the "documentation":http://developer.qt.nokia.com/doc/qt-4.8/qml-extending.html#methods.
-
Of course you do, because your class does neither inherit from QObject, nor does it contain the Q_OBJECT macro. See the "documentation":http://developer.qt.nokia.com/doc/qt-4.8/metaobjects.html.
-
Re-run qmake and clean / rebuild your project.
If you have defined the class within a <code>.cpp</code> file, you will have to <code>#include "filename.moc"</code> as well.
If you still experience problems just paste your code here (or on pastebin), so we can take a look at it.
-
this is main.cpp file*
@#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QDeclarativeView>
#include <QDeclarativeComponent>
#include <QDeclarativeEngine>
#include <QDebug>
#include <QDeclarativeContext>
class Sample:public QObject
{
Q_OBJECT
public:
int32_t x;
int32_t y;
Q_INVOKABLE QString getmouseposition() const
{
QDeclarativeEngine *engine=new QDeclarativeEngine;
QDeclarativeComponent component(engine,QUrl::fromLocalFile(("qml/justforTest/main.qml")));
QObject *rect=component.create();
QObject *mousearea=rect->findChild<QObject *>("mouse");
//qDebug()<<"position:"<<mousearea->property("mouseX").toInt()<<","<<mousearea->property("mouseY").toInt();
return mousearea->property(("mouseX")).toString();
}
};Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto); viewer->setMainQmlFile(QLatin1String("qml/justforTest/main.qml")); viewer->showExpanded(); QDeclarativeView view; Sample sample; QDeclarativeContext *qdc=view.rootContext(); qdc->setContextProperty("cppClass",&sample); view.setSource(QUrl::fromLocalFile("qml/justforTest/main.qml")); view.show(); return app->exec();
}
@this is main.qml file
@import QtQuick 1.0
Rectangle
{
width: 360
height: 360
Text {
id: txt
anchors.centerIn: parent
}
MouseArea
{
id:mouse
anchors.fill: parent
onClicked: console.log(cppClass.getmouseposition())}
}@
-
-
What kind of toolset are you using? qmake should add a call to <code>moc</code> automatically. You might take a look at your compile output if <code>moc</code> is acutally called.
If it is just Qt Creator which complains about the file missing this is absolutely correct. The file is generated at the time you compile your application and thus cannot be found earlier. Just compile your application.
If you are using Visual Studio you might need to add this step manually (a how to can be found in the forums).
-
Lukas, can u provide me a small example of how to call c++ functions from qml...this is what i am trying from morning and i am still unsuccessfull........and u asked me about toolset.....actually i am new to qml and qt....so i don't what it is exactly.....
-
Are you using Qt Creator? If so, if it is just Qt Creator, which complains about the file missing, just build and run your application. The file you are trying to include is generated on-the-fly when the application is built, and it is absolutely normal that it isn't available at development time.
!http://img208.imageshack.us/img208/766/filenotfounderror.png! This means you are fine.
Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.
-
Well, you then either
- do it the way it is supposed to be done or
[quote author="Lukas Geyer" date="1327401808"]Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.[/quote] - you pack and upload your current application and link it here, so I can take a look on it.
- do it the way it is supposed to be done or
-
http://www.mediafire.com/?b9a9r9t6qq9aoao
i uploaded the project.....have a look at it.....thanks in advance......
-
<code>main.moc</code> is generated as expected and the project compiles fine using MinGW and MSVC2010. Be aware that you have to <code>#include "main.moc"</code> at the end of the source file (or at least after the class definition).
I don't know what's the problem on your end.
Is there any reason you are not just doing it as it is supposed to be done?
[quote author="Lukas Geyer" date="1327401808"]Usually classes in general and classes subclassing QObject in particular are defined in <code>.h</code> files and implemented in <code>.cpp</code>. This way you do not need to mess around with including any generated files.[/quote]