QAbstractListModel |
Здравствуйте, гость ( Вход | Регистрация )
QAbstractListModel |
gpepsi |
3.5.2011, 10:54
Сообщение
#1
|
Студент Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: 0 |
Нужна таблица с десятком колонок и многими сотнями строк.
Создал модель. Переопределил для нее 1. rowCount 2. columnCount 3. headerData 4. data Далее довольно интенсивно добавляю записи. После каждого добавления прокручиваю скрол и делаю модели reset. После нескольких сотен записей приложение ложиться. Хотя на экран влезает лишь пару десятков строк, но модель пытается получить данные для всех строк. Нафига она это делает для невидимых строк и как заставить отрисовывать ее только видимые строки. |
|
|
wiz29 |
3.5.2011, 11:31
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
. напиши свою модель данных, раз не устраивает стандартная реализация QStringListModel (скорее всего ты ее используешь). Для этого нужно реализовать интерфейс QAbstractListModel унаследовавшись от QAbstractListModel. Если работа каких то виртуальных методов не устраивает, никто не запрещает реализацию этих методов переопределить...
Сообщение отредактировал wiz29 - 3.5.2011, 11:33 |
|
|
gpepsi |
3.5.2011, 14:47
Сообщение
#3
|
Студент Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: 0 |
. напиши свою модель данных, раз не устраивает стандартная реализация QStringListModel (скорее всего ты ее используешь). Для этого нужно реализовать интерфейс QAbstractListModel унаследовавшись от QAbstractListModel. Если работа каких то виртуальных методов не устраивает, никто не запрещает реализацию этих методов переопределить... а что я и сделал Создал модель. Переопределил для нее
1. rowCount 2. columnCount 3. headerData 4. data |
|
|
wiz29 |
3.5.2011, 14:56
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: 12 |
Для твоего случая переопределить только те 4 метода значит мало (это базовые методы, которые достаточно переопределить, чтобы модель просто "ожила"), необходимо больше телодвижений, к сожалению, скорее всего, стандартные реализации тебе тут не помогут, придется руками переопределять реализацию тех методов, которые понижают производительность твоего приложения и ни как иначе.
|
|
|
gpepsi |
3.5.2011, 17:29
Сообщение
#5
|
Студент Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: 0 |
Для твоего случая переопределить только те 4 метода значит мало (это базовые методы, которые достаточно переопределить, чтобы модель просто "ожила"), необходимо больше телодвижений, к сожалению, скорее всего, стандартные реализации тебе тут не помогут, придется руками переопределять реализацию тех методов, которые понижают производительность твоего приложения и ни как иначе. так про то и вопрос был - что именно нужно еще сделать ? |
|
|
Litkevich Yuriy |
3.5.2011, 21:04
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
gpepsi |
4.5.2011, 7:37
Сообщение
#7
|
Студент Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
PAFOS |
6.5.2011, 8:13
Сообщение
#8
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Цитата После каждого добавления прокручиваю скрол и делаю модели reset. При добавлении записей (т.е. в методе virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() )) необходимо вызывать методы beginInsertRows() перед непосредственным добавлением строк и endInserRows() после него. В этом случае представление, показывающее твою модель обновит только новые строчки и не надо вызывать reset(). |
|
|
gpepsi |
6.5.2011, 11:53
Сообщение
#9
|
Студент Группа: Участник Сообщений: 73 Регистрация: 31.3.2010 Пользователь №: 1582 Спасибо сказали: 0 раз(а) Репутация: 0 |
При добавлении записей (т.е. в методе virtual bool insertRows ( int row, int count, const QModelIndex & parent = QModelIndex() )) необходимо вызывать методы beginInsertRows() перед непосредственным добавлением строк и endInserRows() после него. В этом случае представление, показывающее твою модель обновит только новые строчки и не надо вызывать reset(). накидал тестовый пример с использованием insertRows. Можно увидеть как ложиться приложение. Если раскомментировать assert в методе data, то можно увидеть, что он отработает, хотя первая строка не отображается. Это и говорит о моем предположении, что QTreeView пытается вычитать всю модель, а не только те строки, которые отображаются. Если данных много, то кирдык. Получается, что куча ненужного кода, а работает так же как и обычный reset main.cpp
treeview.h
treeview.cpp
|
|
|
PAFOS |
6.5.2011, 12:58
Сообщение
#10
|
Активный участник Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: 8 |
Возникает данная ересь именно при скролинге.
Если посмотреть внимательно, то когда приложение сваливается, значение переменной role в данном вызове равно 13, что означает Qt::SizeHintRole. Если углубиться дальше, то поднявшись по стеку вызовов, попадем в итоге на int QTreeView::verticalOffset() const. В этом методе есть такой код:
т.е. да, view шерстит всю модель на Qt::SizeHintRole. Вот класс QTableView не определяет при каждом скролинге высоту каждого итема и все работает гуд. Сообщение отредактировал PAFOS - 6.5.2011, 13:24 |
|
|
Текстовая версия | Сейчас: 28.12.2024, 7:23 |