QML Functions - Q_INVOKABLE

I have a problem with QML, with calling Q_INVOKABLE functions. Although I marked the functions as Q_INVOKABLE, I get errors

TypeError: Result of expression 'azdownloader.setData' is not a function TypeError: Result of expression 'azdownloader.perform' is not a function 

I have this class:

 typedef QString lyricsDownloaderString; class lyricsDownloader : public QObject { public: Q_INVOKABLE virtual short perform() = 0; Q_INVOKABLE inline void setData(const string & a, const string & t); // set artist and track // some other data protected: lyricsDownloader(const string & a, const string & t ) : artist(a), track(t) {} /*other data*/ }; class AZLyricsDownloader : public lyricsDownloader { public: AZLyricsDownloader() : lyricsDownloader("", "") {} AZLyricsDownloader(const string & a, const string & t) : lyricsDownloader(a, t) {} Q_INVOKABLE short perform(); Q_INVOKABLE inline void setData(const string & a, const string & t);// set artist and track /*other data*/ 

In main.cpp

 Q_DECL_EXPORT int main(int argc, char *argv[]) { QApplication app(argc, argv); mainWindow viewer; qmlRegisterUncreatableType<lyricsDownloader>("MaeLyrica", 1, 0, "lyricsDownloader", ""); qmlRegisterType<AZLyricsDownloader>("MaeLyrica", 1, 0, "AZLyricsDownloader"); viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto); viewer.setMainQmlFile(QLatin1String("qml/maelyrica/main.qml")); viewer.showFullScreen(); return app.exec(); } 

in main.qml

 import QtQuick 1.1 import com.nokia.meego 1.0 import com.nokia.extras 1.0 import MaeLyrica 1.0 //property color fontcolor: "white" PageStackWindow { id: pagestackwindow visible: true MainPage { id: mainview } initialPage: mainview AZLyricsDownloader { id: azdownloader } } 

And on the pages

 import QtQuick 1.1 import com.nokia.meego 1.0 Page { /*some gui elements*/ Button { id: go text: "Go!" width: parent.width onClicked: { goLoader.source = "ShowLyricsPage.qml" pageStack.push(goLoader.item) azdownloader.perform() showLyricsPage.busyind.visible = false } } } /*dialogs and toolbar definitions*/ } 

Other:

 import QtQuick 1.1 import com.nokia.meego 1.0 Sheet { id: sheet acceptButtonText: "Save" rejectButtonText: "Cancel" onAccepted: { if ( artistfield.text == "" || trackfield.text == "" ) // check whether empty { emptyfieldsdialog.open() } else { selecttrack.text = artistfield.text + " - " + trackfield.text azdownloader.setData(artistfield.text, trackfield.text) } } content: Rectangle { /*some content here*/ } /*dialog definition*/ 

What am I doing wrong?

+4
source share
1 answer

Judging by what you inserted here, a quick inspection shows that you managed to do what we all start:

You forgot the Q_OBJECT macro in your QObject-based class.

Without this, you will not get the meta object generated for your class, and therefore signals, slots, and other similar functions (such as Q_INVOKABLE) will not function properly. Hope that helps :)

+16
source

All Articles