beginInsertRows, Сложная модель |
Здравствуйте, гость ( Вход | Регистрация )
beginInsertRows, Сложная модель |
PAFOS |
21.2.2011, 15:18
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Здравствуйте. Нужен хелп.
Есть 2 SQL таблицы. leafs( leaf_id int primary key auto_increment, name text ) sizes( size_id int primary key auto_increment, leaf_id int, name ) соответственно sizes.size_id = leaf_id Сделал свою модель. В моделе храню две QSqlTableModel - одна для leafs, другая для sizes В своей моделе сделал иерархию. Корень записи из leafs, ветка 1-го уровня - записи из sizes. Для показа/редиктирования модели сделал два виджета QTableView. Один показывает leafs, другой sizes. Когда выбираю строку из leafs, генерится сигнал currentRowChanged(QModelIndex current,QModelIndex previous). В нем я делаю m_sizesModel->setRootIndex(current); Все работает, записи добавляются и в ту и другую таблицы, данные изменяются корректно. Когда доходит дело до удаления записей начинается лажа. согласно документации для удаления записей я должен переопределить метод removeRows( int row, int count, QModelIndex parent) в нем я должен вызвать метод beginRemoveRows() прежде чем удалять данные и endRemoveRows() после того как данные удалены. В метод приходят корректные аргументы (т.е. валидный индекс, номер строки и кол-во) при вызове метода beginRemoveRows(parent,row,row+count-1) прога намертво виснет! даже не знаю в чем беда! |
|
|
Rocky |
21.2.2011, 15:26
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 530 Регистрация: 22.12.2008 Из: Санкт-Петербург Пользователь №: 463 Спасибо сказали: 22 раз(а) Репутация: 7 |
соответственно sizes.size_id = leaf_id Или sizes.leaf_id = leafs.leaf_id ? В метод приходят корректные аргументы (т.е. валидный индекс, номер строки и кол-во) при вызове метода beginRemoveRows(parent,row,row+count-1) прога намертво виснет! Точно валидные? А данных много? Может выложишь минимальный компилируемый код, демонстрирующий проблему? |
|
|
PAFOS |
25.2.2011, 17:58
Сообщение
#3
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Разобрался. Неверно указывал parent для индексов, поэтому получались бесконечные вызовы beginRemoveRows;
|
|
|
PAFOS |
26.2.2011, 13:29
Сообщение
#4
|
|||
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
что-то я поторопился...
Упростил задачу до нельзя. Есть две таблицы PROFILE_SYSTEMS и PROFILES структура PROFILE_SYSTEMs: system_id INT PK NN AI, name TEXT структура PROFILES: profile_id INT PK NN AI, system_id INT NN, name TEXT соответственно вырисовывается иерархия - корень - PROFILE_SYSTEMS.system_id - потомок PROFILES.profile_id Сделал модель, которая содержит в себе две QSqlTableModel Вот код модели: Заголовочный файл: Раскрывающийся текст
Исходный код: Раскрывающийся текст
для показа модели поместил на форму два QListView один показывает PROFILE_SYSTEMS.name другой показывает PROFILES.name вот исходный код Раскрывающийся текст
функция beginRemoveRows() ведет себя очень странно - если в модели больше 3 элементов и я удаляю предпоследний, то возврата из beginRemoveRows() происходит. Теперь вопрос - каким образом указывать предков для элементов таблицы PROFILES? У меня сейчас так - каждый QModelIndex из таблицы PROFILES имеет предка PROFILE_SYSTEMS.system_id
|
|||
|
||||
PAFOS |
26.2.2011, 14:38
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
ВОН ОН ГДЕ ЖУК ЗАРЫЛСЯ!!!!
При удалении QModelIndex (что неизбежно делать надо при removeRows()) я забывал удалять из m_internalIds идентификаторы, тем самым путая логику. |
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:56 |