我正在使用Q_PROPERTY和QML。我的代码是:
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中的一个页面是
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 ++中正确运行,该函数返回应该在TextEdit中的文本。
但不幸的是,TextEdit是空白的。那里没有显示文字。 没有信号体,但AFAIK信号不需要它。
如果我使用
Q_PROPERTY(QString lyrics READ lyrics CONSTANT)
结果是一样的。
我做错了什么?
答案 0 :(得分:8)
当您在C ++代码中更改lyrics
属性的值时,您必须发送属性的NOTIFY
信号(此处为void lyricsChanged();
):
this->setProperty("lyrics", myNewValue);
emit lyricsChanged();
在这种情况下,QML应该更新属性的值。