Q_PROPERTY не отображается
Я использую 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)
результат тот же.
Что я делаю неправильно?
1 ответ
Решение
Когда вы меняете значение lyrics
свойство в коде C++, вы должны отправить NOTIFY
сигнал о собственности (здесь void lyricsChanged();
):
this->setProperty("lyrics", myNewValue);
emit lyricsChanged();
В этом случае QML должен обновить значение свойства.