Qt QML C ++ QList структур как пользовательская модель ListView - PullRequest
1 голос
/ 02 ноября 2011

В моем проекте есть двоичный файл, который содержит список элементов структуры:

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

После чтения данных из файла все значения чтения хранятся в следующем поле моего класса:

QVector<Entry> entires;

Я открываю этот список для QML со следующим объявлением:

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

, за которым следуют методы получения и установки.

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

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

Каждый раз, когда файлЧтение Метод setEntries используется для установки вектора и для генерации сигнала.

Представление списка в QML имеет файл-содержимое Q_PROPERTY, присоединенное к модели:

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
        }
    }
}

Как получить доступданные, которые хранятся в списке структур и отображаются в QML?

ОБНОВЛЕНИЕ: После ваших предложений я немного изменил код, и теперь он хорошо компилируется.Был создан следующий класс:

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
        }
    }
}

ОБНОВЛЕНИЕ 2 ОК, после еще одного анализа мне удалось найти решение, которое работает.Что касается объявления ListView выше, оно было обновлено до текущего состояния (передача структуры по ссылке не работала, мне пришлось использовать копирование по значению).

Оба ответа были полезны в некотором роде, но, поскольку только один можетбыть принятым, я приму первый, написанный Радоном.Спасибо вам обоим за руководство!

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

QML не может получить доступ к типам низкого уровня struct.

Но вы можете создать класс EntryClass, который наследует QObject и добавить id и name как свойства Qt (внутренне EntryClass можетиспользуйте данные соответствующих экземпляров Entry struct, например, используя указатель на них).Тогда вы сможете получить доступ к этим свойствам в QML.

(Но я не проверял это)

0 голосов
/ 03 ноября 2011

Радон прав, ваши объекты, экспортируемые в QML, нуждаются в свойствах (или функциях Q_INVOKABLE).

Кроме того, QVector также не будет работать.Вам необходимо использовать QDeclarativeListProperty или QVariantList в качестве типа свойства.

...