Qt, QML, C++ QList von Strukturen als benutzerdefinierte ListView-Modell

Was ich in meinem Projekt ist die binäre Datei, die enthält eine Liste von Strukturelementen:

typedef struct {
    unsigned int   id;
    char           name[SIZE];
} Entry;

Nach dem Lesen der Daten aus der Datei in die ich alle gelesen Werte gespeichert, die in das folgende Feld meiner Klasse:

QVector<Entry> entires;

Ich tun, setzen Sie diese Liste, um QML mit der folgenden Erklärung:

Q_PROPERTY(QVector<Entry> FileContents READ getEntries NOTIFY TmpFileUpdated)

gefolgt von getter-und setter-Methoden.

inline QVector<Entry> getEntries () 
{ 
    return this->entires; 
}

inline void setEntries(QVector<entires> entries) 
{ 
    this->entires= entries; 
    emit TmpFileUpdated(); 
}

Jedes mal die Datei gelesen "setEntries" Methode wird verwendet, um die Vektor-und um ein signal auszusenden.

Listview in QML hat die Q_PROPERTY FileContents angebracht, um das Modell:

ListView {
    id: myListView
    width: 200
    height: 400

    model: myInjectedObject.FileContents

    delegate: Row {
        spacing: 10         
        Text {
            text: model.entry_type //(1)
            font.pixelSize: 12
            horizontalAlignment: "AlignHCenter"
            verticalAlignment: "AlignVCenter"
            height: 20
        }
    }
}

Wie der Zugriff auf die Daten gehalten, auf die Liste der Strukturen und zeigen Sie es in QML?

UPDATE:
Nachdem Ihre Vorschläge, die ich änderte den code leicht und es kompiliert jetzt gut. Die folgende Klasse erstellt wurde:

class EntryClass: QObject
{
    Q_OBJECT
    Q_PROPERTY(QString entry_name READ getEntryName)
public:
    inline EntryClass(Entry entrystruct)
    {
        this->entry = entrystruct;
    }
private:
    Entry entry;

    inline QString getEntryName() const
    {
        return this->entry->entry_name;
    }    
};

ListView {
    id: myListView
    width: 200
    height: 400

    model: myInjectedObject.FileContents

    delegate: Row {
        spacing: 10       
        Text {
            text: modelData.entry_name //(1)
            font.pixelSize: 12
            horizontalAlignment: "AlignHCenter"
            verticalAlignment: "AlignVCenter"
            height: 20
        }
    }
}

UPDATE 2
OK, nach einigen weiteren Analyse habe ich es geschafft, die Lösung finden, die funktioniert. Bezüglich der ListView Erklärung oben wurde aktualisiert, um den aktuellen Stand (struct übergeben durch Referenz hat nicht funktioniert, musste ich mit copy-by-value).

Beide Antworten waren hilfreich, in gewisser Weise, aber da nur einer kann angenommen werden, werde ich annehmen, der erste, geschrieben von Radon.
Danke Euch beiden für die Anleitung!

InformationsquelleAutor schedar | 2011-11-02
Schreibe einen Kommentar