Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обновление модели 
:(
    Опции темы
vlarry
Дата 26.1.2011, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый день, форумчане!У меня есть модель дерева унаследованная от qAbstractItemModel и представление QTreeView. Модель(не редактируемая) заполняется данными из бд. Все работает нормально, только при внесении новых данных в базу приходиться перезапускать программу, чтобы увидеть новые данные. Как можно обновить модель, чтобы данные можно было сразу видеть?Применял reset(), но это не помогает.
PM MAIL   Вверх
ecspertiza
Дата 26.1.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Собственно можно очистить модель, и заново запустить процедуру заполнения данных из БД smile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
vlarry
Дата 26.1.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



а поподробнее можно? каким образом очистить? Метода clear() у меня нет, т.е. написать свой? 
PM MAIL   Вверх
vlarry
Дата 26.1.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



ни у кого нет больше никаких идей? Уже все перепробовал, но пока не нашел способ как это сделать

Добавлено через 4 минуты и 57 секунд
не знаю правильно ли, но работает...я при занесении новых данных удаляю модель, а затем снова ее создаю и подсоединяю к вьюхе...работает....
PM MAIL   Вверх
ecspertiza
Дата 26.1.2011, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Цитата(vlarry @  26.1.2011,  18:00 Найти цитируемый пост)
а поподробнее можно? каким образом очистить? Метода clear() у меня нет, т.е. написать свой?  


поскольку писали модель унаследованную от абстрактной то и метод очистки придется писать свой. ИМХО это будет гораздо более верным решением чем удаление и создание новой модели smile


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
Batbko
Дата 26.1.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



Цитата(vlarry @  26.1.2011,  18:21 Найти цитируемый пост)
не знаю правильно ли, но работает...я при занесении новых данных удаляю модель, а затем снова ее создаю и подсоединяю к вьюхе...работает....


Постарайся никогда так не делать.

Для начала выдели код загружающий данные в отдельную(ые) функцию(и).

Затем добавь к своей модели открытую функцию, а лучше слот с именем типа refresh или upToDate
и примерно следующим содержимым:
Код

void YourModel::refresh()
{
  beginResetModel();
 // код перестройки модели
 endResetModel();
}

вроде как всё просто  smile.

PM MAIL   Вверх
vlarry
  Дата 27.1.2011, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо попробую
PM MAIL   Вверх
vlarry
Дата 27.1.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Batbko, спасибо большое все работаетsmile
PM MAIL   Вверх
vlarry
Дата 30.1.2011, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Все работает, но не до конца так как хотелосьsmile...при обновлении остается старое дерево и в конец добавляется новое....как обновить QTreeView?
PM MAIL   Вверх
Batbko
Дата 30.1.2011, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



Уверен что до конца данные удаляешь при обновлении ?
PM MAIL   Вверх
vlarry
Дата 31.1.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Цитата(Batbko @ 30.1.2011,  23:09)
Уверен что до конца данные удаляешь при обновлении ?

я в методе обновления updateModel, вызываю метод setupModelData()...а удалять ничего не удаляюsmile...
PM MAIL   Вверх
Batbko
Дата 31.1.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



Покажи код заполнения данными.
Потому что, лично я думаю что у тебя происходит примерно следующее :
1.Загружаешь данные из БД.
2.Или копируешь эти данные в структуры данных в которых дальше их хранишь, или настраиваешь отображение напрямую из запросов.
3.Reset'ишь модель дабы все представления узнали о том, что данные изменились.

Так вот, я предположил что ты копируешь эти данные, и не до конца очищаешь их при следующем обновлении.
PM MAIL   Вверх
vlarry
Дата 31.1.2011, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Цитата(Batbko @  31.1.2011,  14:19 Найти цитируемый пост)
или настраиваешь отображение напрямую из запросов

Код

void TreeModel::setupModelData(const QString &nameDb, TreeItem *parent)
{
    connection(nameDb);

    QSqlTableModel* modelGenre = new QSqlTableModel();
    QSqlTableModel* modelFilm  = new QSqlTableModel();

    modelGenre->setTable("genre");
    modelGenre->select();

    modelFilm->setTable("film");

    for(int count_parent = 0; count_parent < modelGenre->rowCount(); count_parent++)
    {
        QString str = modelGenre->record(count_parent).value("name").toString();
        TreeItem* item = new TreeItem(QStringList() << str, parent);
        parent->appendChild(item);

        modelFilm->setFilter("genre = '" + str + "'");
        modelFilm->select();

        for(int count_child = 0; count_child < modelFilm->rowCount(); count_child++)
        {
            TreeItem* child = new TreeItem(QStringList() << modelFilm->record(count_child).value("name").toString(), item);
            item->appendChild(child);
        }
    }
}

PM MAIL   Вверх
Batbko
Дата 1.2.2011, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 17.12.2010

Репутация: нет
Всего: нет



Вот здесь ты конструируешь некий TreeItem который не удаляется до удаления модели,
а должен удаляться во время обновления данных.
Код

TreeItem* item = new TreeItem(QStringList() << str, parent);


Думаю, что если обновить твою модель 3 раза, то деререво будет повторяться 4 раза.
PM MAIL   Вверх
vlarry
Дата 1.2.2011, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



этот item верхнего уровня, а к нему уже крепятся дочерние child. А обновлять - это разве что удалять корень. Я написал в методе обновления:
Код

void updateModel()
{
        beginResetModel();
        delete rootItem;          // это корень дерева
        rootItem = new TreeItem;
        setupModelData(rootItem);
        endResetModel();


так работает, но будет ли это правильно и еще вопрос, а не будет ли это тормозить, когда в базе будет много записей?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1221 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.