QML - функции Q_INVOKABLE

У меня проблема с QML, с вызовом функций Q_INVOKABLE. Хотя я пометил функции как Q_INVOKABLE, я получаю ошибки

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

У меня такой класс:

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*/

В 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();
}

в 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
    }
}

И на страницах

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*/
}

Другой:

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*/

Что я делаю неправильно?


person marmistrz    schedule 18.07.2012    source источник


Ответы (1)


Судя по тому, что вы здесь вставили, беглый осмотр показывает, что вам удалось сделать то, с чего мы все начинаем:

Вы забыли макрос Q_OBJECT в своем классе на основе QObject.

Без этого вы не получите метаобъект, сгенерированный для вашего класса, и, следовательно, сигналы, слоты и другие подобные функции (например, Q_INVOKABLE) не будут работать должным образом. Надеюсь, это поможет :)

person leinir    schedule 18.07.2012
comment
Теперь я получаю moc_lyricsDownloader.cpp: 76: error: undefined ссылка на `lyricsDownloader :: setData (std :: basic_string‹ char, std :: char_traits ‹char›, std :: allocator ‹char› ›const &, std :: basic_string ‹char, std :: char_traits ‹char›, std :: allocator ‹char›› const &) ' - person marmistrz; 18.07.2012
comment
РЕДАКТИРОВАТЬ: после добавления тела функции в определение класса все в порядке. - person marmistrz; 18.07.2012