Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Zealot от Декабрь 17, 2008, 23:55



Название: Модель-представление. Варианты реализации.
Отправлено: Zealot от Декабрь 17, 2008, 23:55
Посоветуйте варианты реализации вот для такой вот штуковины:

Имеем дом-модель xml документа.
Необходимо:
При просмотре в дереве (QTreeView) - в качестве элементов отображает имена узлов(QDomNode) (т.е. отображаем структуру документа).
При просмотре в списке (QListView)  - в качестве элементов выводит xml код каждого узла (т.е. получается копия документа XML только в виде списка).

Пример:
XML:
<node1 arg="foo">
   <node2 arg="foo"/>
...
</node1>

QTreeView:
+node1
|-+node2
...

QListView:
<node1 arg="foo">
<node2 arg="foo"/>
...
</node1>

Есть некоторые соображения по решению данной задачи, но хотелось бы посоветоваться, вдруг есть получше.
Пока думаю использовать различную роль:
QVariant DomModel::data(const QModelIndex &index, int role) const
{
    switch(role)
    {
    case Qt::DisplayRole:
       return имяУзла;
    break;
    case Qt::ToolTipRole:
       return хмлПредставлениеУзла;
    break;
    default:
       return QVariant();
    }
}
И переопределить в наследнике QListView отображение с Qt::DisplayRole на Qt::ToolTipRole.
Только что-то этот способ кажется очень топорным.
Думаю есть более изящные способы, только никак не могу к ним придти....


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Racheengel от Декабрь 18, 2008, 12:05
думаю, надо делать 2 модели.
Либо одну базовую, а вторую - через прокси-модель из первой.


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Zealot от Декабрь 18, 2008, 21:10
Тогда, в случае изменения одной модели, необходимо также модифицировать другую. А если придется использовать третье представление, например таблицу, то еще +1.
Или есть способы синхронизации данных в двух моделях?


Название: Re: Модель-представление. Варианты реализации.
Отправлено: spirit от Декабрь 18, 2008, 21:22
использовать прокси-модель


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Zealot от Декабрь 19, 2008, 08:49
Спасибо! Сегодня по-изучаю прокси-модель заодно и попробую реализовать с помощью нее.


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Racheengel от Декабрь 19, 2008, 11:12
Можно не хранить данные в модели, а только отображать посредством методов data(...).
Например, отдельно хранить XML документ, а обоим моделям передать поинтер на него.
Тогда при изменении документа, нужно будет просто вызвать метод обновления моделей, и все.


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Zealot от Декабрь 19, 2008, 19:16
Можно не хранить данные в модели, а только отображать посредством методов data(...).
Например, отдельно хранить XML документ, а обоим моделям передать поинтер на него.
Тогда при изменении документа, нужно будет просто вызвать метод обновления моделей, и все.

Точно. Ведь в архитектуре модель - представления не сказано,
что модель данных должна содержать в себе сами данные. Получается, что модель данных это
что-то вроде выборки данных определенным образом.

Единственное только тогда не понятно, что предпочтительнее использовать: встроенные средства(QProxyModel)
или такие хитрухи, как указатели на данные вместо самих данных?


Название: Re: Модель-представление. Варианты реализации.
Отправлено: spirit от Декабрь 19, 2008, 19:19
я считаю, что кэшировать данные в модели не есть плохо.


Название: Re: Модель-представление. Варианты реализации.
Отправлено: Zealot от Декабрь 19, 2008, 19:28
Я б и сам определился что лучше, а что хуже но поскольку только начал изучение данной архитектуры еще не прочувствовал ее как следует. Нужно посмотреть возможности моделей на конкретных реализациях. Есть какие-нибудь примеры помимо кьютешных стандартных? Или статьи по-подробней? А то 2 абзаца кьютешной документации по прокси-моделям совсем не раскрывают их тайный смысл.