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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Модель дерева унаследованная от QAbstractItemModel - нужеl  (Прочитано 6402 раз)
Larry
Гость
« : Январь 28, 2011, 16:24 »

Добрый день! Я хотел бы узнать, как ПРАВИЛЬНО создать свою модель дерева на основе QAbstractItemModel. Как правильно ее заполнять, обновлять, добавлять данные и т.д. и т.п. На данный момент у меня есть модель, но я считаю что она неправильно создана. Суть этой модели: отображать данные,которые находятся в таблицах бд. Модель сделал на основе примера тролей simpletreemodel. Добавление данных идет не через модель, а напрямую в бд. Одним словом я уже запутался и хочу попросить совета как правильно создать эту модель дерева, чтобы можно было не химичить потом с обновлением и т.д. Помогите пожалуйста советом...
« Последнее редактирование: Январь 31, 2011, 10:04 от Пантер » Записан
UVV
Гость
« Ответ #1 : Январь 28, 2011, 16:37 »

Что значит добавление идёт напрямую в БД? Оно происходит где-то вне твоей программы?
Записан
Larry
Гость
« Ответ #2 : Январь 28, 2011, 16:41 »

в программе, но вне модели...данные пользователь вбивает в форму(диалоговое окно), а там уже идет и добавление в бд...мне говорили что это неправильно...при этом возникают проблемы при обновлении данных...
Записан
shirushizo
Гость
« Ответ #3 : Январь 28, 2011, 16:57 »

1. Переопределить методы QAbstractItemModel для возможности редактирования
Код:
bool insertRow ( int row, const QModelIndex & parent = QModelIndex() )
virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
bool removeRow ( int row, const QModelIndex & parent = QModelIndex() )
virtual bool removeRows ( int row, int count, const QModelIndex & parent = QModelIndex() )
virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )
2. Написать свой делегат или использовать стандартные
3. Ну и сделать кнопки добавить/удалить

Сама структура дерева в том примере нормально описана. А вот насчет обновления модели при изменении БД (многопользовательское редактирование) самому интересно)
« Последнее редактирование: Январь 29, 2011, 09:41 от shirushizo » Записан
Larry
Гость
« Ответ #4 : Январь 28, 2011, 17:08 »

у меня не редактируемая модель...если надо отредактировать, то вызывается диалог в котором это и происходит(правда до этого я еще не дошел:))...т.е добавление данных делать через методы insertRow/s и setData?
Записан
Larry
Гость
« Ответ #5 : Январь 28, 2011, 17:16 »

обновление делаю вызывая метод setupModelData()(в нем происходит занесение данных в модель), но не могу избавиться от бока, записи дублируются...пока не могу его убрать...
Записан
shirushizo
Гость
« Ответ #6 : Январь 29, 2011, 10:09 »

у меня не редактируемая модель...если надо отредактировать...
Веселый
Твой диалог можно сделать редактором делегата, при закрытии которого как раз и будут вызываться переопределенные методы.
Эти методы сделаны стандартизации работы модели. Т.е. делегату не важно в каком виде ты хранишь данные в модели и как в нее записывать данные так же, как и представлению.

у QItemDelegate за редактирование отвечают 3 метода
Код:
//Создание виджета-редактора
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,  const QModelIndex &index) const;
//Установка значений в виджет-редактор
void setEditorData(QWidget *editor, const QModelIndex &index) const;
//Вызывается при закрытии вид[code]жета-редактора, запись данных в модель
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;

Вот кусок реализации:
Код:
void QItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
...
    QByteArray n = editor->metaObject()->userProperty().name(); //получаем данные из редактора
...
    if (!n.isEmpty())
        model->setData(index, editor->property(n), Qt::EditRole); //записываем данные в модель
}
[/code]
« Последнее редактирование: Январь 30, 2011, 12:32 от shirushizo » Записан
Larry
Гость
« Ответ #7 : Январь 29, 2011, 12:09 »

Спасибо за подсказку так и поступлю, а потом отпишусь, что получилось...
Записан
trot
Гость
« Ответ #8 : Январь 29, 2011, 17:19 »

Предлагается следующие решение, опробаванное на практике.
1. Создаешь класс для хранения данных получаемых из БД. Методы данного класса будут отвечать за выполнения операций с БД
(чтение, редактирование, вставка и удаление). Этот же класс будет генерить ту или иную модель (дерево, таблица, выпадающий список) в зависимость от требований к представлению.
2. Создаешь класс модели, который является посредником между представлением и твоим классом работы с БД.
В итоге получается четырех уровневая логика работы с данными - представление-модель-источник_данных-база_данных.
Записан
Larry
Гость
« Ответ #9 : Январь 29, 2011, 18:13 »

спасибо, мысля такая возникала, но отбросил,..подумал что не справлюсь...хотя стоит попробовать:)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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