Qt 5를 배우기 시작했고 오랫동안 한 지점에서 멈추었습니다.QML에서 C++ 객체의 목록 속성에 액세스하는 방법
두 클래스가 있습니다. ScoreHandler는 ScoreRecords 목록을 처리합니다. C++에서이 두 클래스를 만들고 ScoreHandler의 인스턴스를 컨텍스트 속성으로 설정합니다. 이제는 QML에서 모델을 할당 할 수 있지만 델리게이트는 ScoreRecord의 속성을 볼 수 없습니다. 어딘가에 뭔가를 등록해야합니까? 도와주세요.
scorerecord.h
class ScoreRecord : public QObject
{
Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
Q_PROPERTY(QString date READ date WRITE setDate NOTIFY dateChanged)
Q_PROPERTY(QString score READ score WRITE setScore NOTIFY scoreChanged)
public:
ScoreRecord(QObject *parent = 0);
ScoreRecord(const QString& n, const QString &d, const QString &s, QObject *parent = 0);
QString name() const;
void setName(const QString &str);
QString date() const;
void setDate(const QString &str);
QString score() const;
void setScore(const QString &str);
signals:
void nameChanged();
void dateChanged();
void scoreChanged();
public slots:
private:
QString m_name;
QString m_date;
QString m_score;
};
scorehandler.h
class ScoreHandler : public QObject
{
Q_OBJECT
private:
const char* SCORE_TABLE_FILENAME;
struct scoreRow {
char name[128];
char date[32];
char score[16];
};
public:
explicit ScoreHandler(QObject *parent = 0);
QList<ScoreRecord *> scoreList;
signals:
public slots:
void SaveScore(const QString &name, const QString &date, const QString &score);
void LoadScore();
};
main.c를
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
ScoreHandler* scoreHandler = new ScoreHandler();
QQmlContext* ctx = viewer.rootContext();
ctx->setContextProperty("MyScoreModel", QVariant::fromValue(scoreHandler->scoreList));
viewer.setMainQmlFile(QStringLiteral("qml/qmlListView/main.qml"));
viewer.showExpanded();
return app.exec();
}
QML 파일
import QtQuick 2.0
Rectangle {
width: 360
height: 360
ListView {
width: 100; height: 100
anchors.fill: parent
model: MyScoreModel
delegate: Text {
text: name
}
}
}
그리고 제발 누군가가 나를 설명 할 수 있습니다, 왜 다음 코드는 작동합니까? 그 이유는 무엇입니까?
난 강력하게
ctx->setContextProperty("MyScoreModel", QVariant::fromValue(scoreHandler->scoreList));
주어진 예제에서 빈 현재 목록의 사본을 수행하고 scoreList
을 수정할 때 업데이트되지 않습니다 있다고 생각
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
ScoreHandler* scoreHandler = new ScoreHandler();
QList<QObject *> scoreList;
scoreList.append(new ScoreRecord("Jmeno1", "datum1", "score1"));
scoreList.append(new ScoreRecord("Jmeno2", "datum2", "score2"));
scoreList.append(new ScoreRecord("Jmeno3", "datum3", "score3"));
QQmlContext* ctx = viewer.rootContext();
ctx->setContextProperty("MyScoreModel", QVariant::fromValue(scoreList));
viewer.setMainQmlFile(QStringLiteral("qml/qmlListView/main.qml"));
viewer.showExpanded();
return app.exec();
}
가 해결을, 내가 QList를 변경했다 scoreList; QList에 scoreList; QML에서 속성을 볼 수있게합니다. –
user3032524