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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модель-представление. Варианты реализации.  (Прочитано 6176 раз)
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.
Только что-то этот способ кажется очень топорным.
Думаю есть более изящные способы, только никак не могу к ним придти....
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Декабрь 18, 2008, 12:05 »

думаю, надо делать 2 модели.
Либо одну базовую, а вторую - через прокси-модель из первой.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Zealot
Гость
« Ответ #2 : Декабрь 18, 2008, 21:10 »

Тогда, в случае изменения одной модели, необходимо также модифицировать другую. А если придется использовать третье представление, например таблицу, то еще +1.
Или есть способы синхронизации данных в двух моделях?
Записан
spirit
Гость
« Ответ #3 : Декабрь 18, 2008, 21:22 »

использовать прокси-модель
Записан
Zealot
Гость
« Ответ #4 : Декабрь 19, 2008, 08:49 »

Спасибо! Сегодня по-изучаю прокси-модель заодно и попробую реализовать с помощью нее.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Декабрь 19, 2008, 11:12 »

Можно не хранить данные в модели, а только отображать посредством методов data(...).
Например, отдельно хранить XML документ, а обоим моделям передать поинтер на него.
Тогда при изменении документа, нужно будет просто вызвать метод обновления моделей, и все.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Zealot
Гость
« Ответ #6 : Декабрь 19, 2008, 19:16 »

Можно не хранить данные в модели, а только отображать посредством методов data(...).
Например, отдельно хранить XML документ, а обоим моделям передать поинтер на него.
Тогда при изменении документа, нужно будет просто вызвать метод обновления моделей, и все.

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

Единственное только тогда не понятно, что предпочтительнее использовать: встроенные средства(QProxyModel)
или такие хитрухи, как указатели на данные вместо самих данных?
Записан
spirit
Гость
« Ответ #7 : Декабрь 19, 2008, 19:19 »

я считаю, что кэшировать данные в модели не есть плохо.
Записан
Zealot
Гость
« Ответ #8 : Декабрь 19, 2008, 19:28 »

Я б и сам определился что лучше, а что хуже но поскольку только начал изучение данной архитектуры еще не прочувствовал ее как следует. Нужно посмотреть возможности моделей на конкретных реализациях. Есть какие-нибудь примеры помимо кьютешных стандартных? Или статьи по-подробней? А то 2 абзаца кьютешной документации по прокси-моделям совсем не раскрывают их тайный смысл.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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