4

QMLでQ_PROPERTYを使用しています。私のコードは次のとおりです。

using namespace std;

typedef QString lyricsDownloaderString; // this may be either std::string or QString

class lyricsDownloader : public QObject
{
    Q_OBJECT
public:
    Q_PROPERTY(QString lyrics READ lyrics NOTIFY lyricsChanged)
    Q_INVOKABLE virtual short perform() = 0;
    inline void setData(const string & a, const string & t); // set artist and track
    Q_INVOKABLE inline void setData(const QString & a, const QString & t); // for QStrings
    Q_INVOKABLE inline bool anyFieldEmpty(); // check whether everything is filled
    inline QString lyrics()
    {
        return lyrics_qstr;
    }

 /*some more data*/
signals:
    void lyricsChanged(QString);
};

class AZLyricsDownloader : public lyricsDownloader
{
    Q_OBJECT
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

protected:
    /*some more data*/
};

QMLのページの1つは

import QtQuick 1.1
import com.nokia.meego 1.0
import com.nokia.extras 1.0

Page
{
    id: showLyricsPage
    tools: showLyricsToolbar

    Column
    {
        TextEdit
        {
            id: lyricsview
            anchors.margins: 10
            readOnly: true
            text: azdownloader.lyrics
        }
    }

    Component.onCompleted:
    {
        azdownloader.perform()
        busyind.visible = false
    }

    BusyIndicator
    {id: busyind /**/ }

    ToolBarLayout
    {id: showLyricsToolbar/**/}

    // Info about disabling/enabling edit mode

    InfoBanner {id: editModeChangedBanner /**/}
}

azdownloaderはAZLyricsDownloaderオブジェクトです

コードはC++で正しく実行され、関数はテキストエディットにあるはずのテキストを返します。

しかし残念ながら、テキストエディットは空白です。そこにはテキストは表示されません。信号の本体はありませんが、AFAIK信号はそれを必要としません。

使用する場合

Q_PROPERTY(QString lyrics READ lyrics CONSTANT)

結果は同じです。

私は何が間違っているのですか?

4

1 に答える 1

8

lyricsC ++コードでプロパティの値を変更する場合は、プロパティのNOTIFYシグナルを送信する必要があります(ここvoid lyricsChanged();):

this->setProperty("lyrics", myNewValue);
emit lyricsChanged();

この場合、QMLはプロパティの値を更新する必要があります。

于 2012-07-19T00:33:43.240 に答える