Russian Qt Forum
Ноябрь 02, 2024, 08:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получить переменные СЛОЖНОГО элемента списка  (Прочитано 2955 раз)
Sasha
Гость
« : Апрель 18, 2012, 19:24 »

Кратко задача такая:
Необходимо отобразить в qml список сложных объектов. Модель списка должна быть описана в Qt коде. И, самое главное, эта модель должна возвращать не отдельные свойства элемента (так всё работает), а целый элемент. Отдельные же свойства должны выделяться в qml из этого цельного элемента.

Более подробно:
Есть объект элемента списка со свойством name:
Код:
class CQMLAbonent : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString name READ name WRITE set_name NOTIFY chgd_name )
    ...
};
Q_DECLARE_METATYPE(CQMLAbonent) // это чтобы в QVariant можно было засунуть

Есть модель представления списка
Код:
class CQMLModelAbonent : public QAbstractListModel
{
    ...
public:
    enum eRoles
    {
         TR_Abon = Qt::UserRole + 1,
         ...
    };
    explicit CQMLModelAbonent(QObject *parent = 0):QAbstractListModel(parent)
    {
         QHash<int, QByteArray> roles;
         roles[TR_Abon] = "abonent";
         ...
         setRoleNames(roles);
    }
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const
    {
        ...
        switch( (eRoles)role )
        {
            case TR_Abon:
                 {
                    CQMLAbonent o( "name" + QString::number( index.row() ) );
                    QVariant v;
                    v.setValue(o);
                    return v;
                 }
            ...
        }
    }
    ...
};
Она возвращает элемент списка.
Всё это в ф-ии main сделано дуступным из qml
Далее код в qml
Код:
ListView
{
  id: listView
  model: core.abons
  delegate:
     Item
     {
        ...
        Text
        {
          ...
          text: abonent.name
        }
     }
}
И вместо корректных имён пишется undefined
Если вместо abonent.name написать abonent, то выводится QVariant(CQMLAbonent)
« Последнее редактирование: Апрель 18, 2012, 19:41 от Sasha » Записан
Sasha
Гость
« Ответ #1 : Апрель 20, 2012, 21:09 »

Неужели так нельзя?

Просто, если в качестве модели использовать не наследника от абстрактной модели, а QDeclarativeListProperty<CQMLAbonent>, то в qml можно просто извлекать свойства объекта по именам. Т.е. в моём примере будет так:
Код:
ListView
{
  id: listView
  model: core.abons
  delegate:
     Item
     {
        ...
        Text
        {
          ...
          text: name
        }
     }
}
А при использовании наследника абстрактной модели приходится писать дополнительную ф-ю, извлекающую по роли свойства объекта + нужно сгенерить имена ролей. Теперь, если в объекте появится новое свойство, или удалится старое или что-то изменится, нужно будит не забыть отразить это в этой ф-ии наследника абстрактной модели. Если же суметь передать в QML объект целиком, то описанные проблеммы исчезнут.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 20.