QT/QML - Odświeżanie modelu danych

0

Hej,

Piszę ponieważ mam pewien problem, z którym borykam się już kilka dni...

Otóż, moja aplikacja pobiera dane z pliku xml i wyświetla je, jeżeli plik xml się zmieni, widok ma się odświeżyć.

Od technicznej strony wygląda to tak:

do QML'a przekazuję sobie listę z danymi

 
...
ctxt->setContextProperty("myModel", QVariant::fromValue(xml.dataList));
...

w pliku QML, mam repeatery:

...
Column {
            Repeater {

                   Text {
                        text: model.modelData.kupno
                    }
                }
                model: myModel
            }
...

Przy zmianie danych niestety widok w QMLu się nie aktualizuje, jak się za to zabrać ?

Z góry dzięki za pomoc.

Pozdrawiam,
c4meleon

0

czym dokładnie jest xml.dataList?
Najprawdopodobmiej musisz to zaktualizować reagujac na sygnał: http://qt-project.org/doc/qt-4.8/qfilesystemwatcher.html#fileChanged
W tym sygnale musisz zaktualizować model i wywołać sygnał informujący model o zmianie danych (model poinformuje itema QML).

0

Dzięki za szybką odpowiedź.

xml.dataList jest obiektem listy ze stringami z XML'a.

Plik: data.h

#ifndef DATE_H
#define DATE_H

#include <QObject>

class Data : public QObject
{

    Q_OBJECT
    Q_PROPERTY(QString flaga READ flaga WRITE setFlaga NOTIFY flagaChanged)
    Q_PROPERTY(QString symbol READ symbol WRITE setSymbol NOTIFY symbolChanged)
    Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
    Q_PROPERTY(QString jednostka READ jednostka WRITE setJednostka NOTIFY jednostkaChanged)
    Q_PROPERTY(QString kupno READ kupno WRITE setKupno NOTIFY kupnoChanged)
    Q_PROPERTY(QString sprzedaz READ sprzedaz WRITE setSprzedaz NOTIFY sprzedazChanged)
    Q_PROPERTY(QString color READ color WRITE setColor NOTIFY colorChanged)
    //![0]

public:
    Data(QObject *parent=0);
    Data(const QString &flaga, const QString &symbol, const QString &name, const QString &jednostka,
         const QString &kupno, const QString &sprzedaz, const QString &color, QObject *parent=0);


    QString flaga() const;
    void setFlaga(const QString &flaga);

    QString symbol() const;
    void setSymbol(const QString &symbol);

    QString name() const;
    void setName(const QString &name);

    QString jednostka() const;
    void setJednostka(const QString &jednostka);

    QString kupno() const;
    void setKupno(const QString &kupno);

    QString sprzedaz() const;
    void setSprzedaz(const QString &sprzedaz);

    QString color() const;
    void setColor(const QString &color);

    void get_data();

signals:
    void flagaChanged();
    void symbolChanged();
    void nameChanged();
    void jednostkaChanged();
    void kupnoChanged();
    void sprzedazChanged();
    void colorChanged();

private:
    QString m_flaga;
    QString m_symbol;
    QString m_name;
    QString m_jednostka;
    QString m_kupno;
    QString m_sprzedaz;
    QString m_color;
    
};

#endif // DATE_H

Plik: data.cpp

#include "data.h"

Data::Data(QObject *parent) :
    QObject(parent)
{}

Data::Data(const QString &flaga, const QString &symbol, const QString &name, const QString &jednostka, const QString &kupno, const QString &sprzedaz, const QString &color, QObject *parent)
    : QObject(parent), m_flaga(flaga), m_symbol(symbol), m_name(name), m_jednostka(jednostka), m_kupno(kupno), m_sprzedaz(sprzedaz), m_color(color)
{
}

QString Data::flaga() const
{
    return m_flaga;
}

void Data::setFlaga(const QString &flaga)
{
    if (flaga != m_flaga) {
        m_flaga = flaga;
        emit flagaChanged();
    }
}

QString Data::jednostka() const
{
    return m_jednostka;
}

void Data::setJednostka(const QString &jednostka)
{
    if (jednostka != m_jednostka) {
        m_jednostka = jednostka;
        emit jednostkaChanged();
    }
}

QString Data::kupno() const
{
    return m_kupno;
}

void Data::setKupno(const QString &kupno)
{
    if (kupno != m_kupno) {
        m_kupno = kupno;
        emit kupnoChanged();
    }
}

QString Data::sprzedaz() const
{
    return m_sprzedaz;
}

void Data::setSprzedaz(const QString &sprzedaz)
{
    if (sprzedaz != m_sprzedaz) {
        m_sprzedaz = sprzedaz;
        emit sprzedazChanged();
    }
}

QString Data::symbol() const
{
    return m_symbol;
}

void Data::setSymbol(const QString &symbol)
{
    if (symbol != m_symbol) {
        m_symbol = symbol;
        emit symbolChanged();
    }
}

QString Data::name() const
{
    return m_name;
}

void Data::setName(const QString &name)
{
    if (name != m_name) {
        m_name = name;
        emit nameChanged();
    }
}

QString Data::color() const
{
    return m_color;
}

void Data::setColor(const QString &color)
{
    if (color != m_color) {
        m_color = color;
        emit colorChanged();
    }
}

xml.dataList to po prostu pętla z danymi z xml'a dodająca do tej tablicy.

dataList.append(new Data(itemele.attribute("imgsrc"), itemele.attribute("symbol"),
                                         itemele.text(), itemele.attribute("jednostka"),
                                         itemele.attribute("kupno"), itemele.attribute("sprzedaz"),
                                         color));

Wszystko fajnie tylko nie bardzo wiem jak się za to zabrać. Na co dzień nie piszę w Qt więc napotykam dużo problemów, a dokumentacja jest kiepska.

Pozdrawiam,
Adrian M.

0

W mojej opinii powinieneś skorzystać, z QAbstractDataModel http://doc.qt.digia.com/qt/qdeclarativemodels.html#qabstractitemmodel bo to zapewnia mechanizm odświeżania danych.
najlepiej zacząć od QAbstractListModel
Na dokumentacje w Qt bym nie narzekał, jest jedną z lepszych.

Jeśli QAbstractListModel to za duża armata dla ciebie to najprostszym rozwiązaniem jest wywołać ctxt->setContextProperty("myModel", QVariant::fromValue(xml.dataList)) za każdym razem, gdy masz zmianę w danych. Zaleta jest taka, jest to proste do poprawienia, w porównaniu do tego co zrobiłeś. Wada, że będzie to nieoptymalne, cały widok zawsze się będzie odświeżał, a nie tylko wtedy, gdy zmieniają się widoczne dane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1