Russian Qt Forum
Ноябрь 23, 2024, 08:30
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
QListView большое количество строк
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: QListView большое количество строк (Прочитано 6455 раз)
AlexNT
Гость
QListView большое количество строк
«
:
Апрель 29, 2014, 22:01 »
Доброго времени суток. Начинающий программист на QT, поэтому прошу стазу сильно не пинать
Понимаю ,что такая проблема у кого то уже была, но не могу найти ответ. Так что ткните носом куда рыть.
Есть модель наследник от QAbstractListModel, данные в модели хранятся в QVector. Отображение QListView. Программа слушает шину данных и выводит пакеты в QListView. В секунду может быть до 2000 пакетов. Пока количество пакетов пришло не большое, до 10 000 все нормально, но потом начинаются тормоза. Понимаю, что модель должна как то отобразить определенное количество данных, а все остальной только при прокрутке в QListView. Куда рыть?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QListView большое количество строк
«
Ответ #1 :
Апрель 29, 2014, 22:05 »
А какой средний размер пакета? Как храните данные в векторе (как указатели на пакеты)?
Записан
AlexNT
Гость
Re: QListView большое количество строк
«
Ответ #2 :
Апрель 29, 2014, 22:13 »
Описана тип структура
typedef struct {
uint8_t FMI; /**< @brief Filter id. */
uint32_t TIME; /**< @brief Time stamp. */
uint8_t DLC; /**< @brief Data length. */
uint8_t RTR; /**< @brief Frame type. */
uint8_t IDE; /**< @brief Identifier type. */
uint8_t IDE2; /**< @brief Identifier type. */
uint32_t SID; /**< @brief Standard identifier.*/
uint8_t data[8]; /**< @brief Frame data. */
} CANRxFrame;
В модели
private:
QVector<CANRxFrame> listFrame;
bool QModel::setData(const QModelIndex &index, const CANRxFrame &value, int role)
{
if (role == Qt::EditRole)
listFrame.replace(index.row(), value);
return true;
}
конечно предварительно использую метод bool QModel::insertRows(int position, int rows, const QModelIndex &index)
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QListView большое количество строк
«
Ответ #3 :
Апрель 29, 2014, 22:14 »
Используйте вместо вектора QList.
Записан
AlexNT
Гость
Re: QListView большое количество строк
«
Ответ #4 :
Апрель 29, 2014, 22:28 »
Цитата: Old от Апрель 29, 2014, 22:14
Используйте вместо вектора QList.
Пробовал. Все равно тормоза. Скорее всего подозреваю что каждый раз при добавлении нового элемента в QList, перерисовываются все данные в отображение.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QListView большое количество строк
«
Ответ #5 :
Апрель 29, 2014, 22:42 »
Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели.
Записан
AlexNT
Гость
Re: QListView большое количество строк
«
Ответ #6 :
Апрель 29, 2014, 23:00 »
Цитата: Old от Апрель 29, 2014, 22:42
Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели.
Дело в том что я делаю такой эксперимент. Запускаю прослушивание шины, накапливаю данные (пакеты) QList. Затем останавливаю прослушивание шины данных. То есть данные в QList больше не добавляются. Теперь в методе модели который отвечает за отображение данных
QVariant QModel::data(const QModelIndex &index, int role) const
ставлю точку останова, и пытаюсь сделать какие то действия с окном программы (или перетаскивание или делаю фокус на окно), и я вижу, что по каждому действию начинается вывод всех данных из QList, даже тех которые не видно (находятся за прокруткой). Из этого я и сделал вывод, что так же и при добавление нового элемента, и вывод в отображение, выводятся все данные из QList заново.
Записан
Bepec
Гость
Re: QListView большое количество строк
«
Ответ #7 :
Апрель 29, 2014, 23:45 »
А у вас никакого свойства типа "размер содержимого по размеру самой большой строки" не установлено? Вроде бы имелся такой функционал у List'View. Он тогда да - перерывает все элементы.
PS а так более 1кк элементов все View уже не переваривают.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: QListView большое количество строк
«
Ответ #8 :
Апрель 30, 2014, 06:35 »
Цитата: AlexNT от Апрель 29, 2014, 23:00
Дело в том что я делаю такой эксперимент.
Это не совсем правильная проверка.
Если вы ставите точку останова, то происходит переключение на окно отладчика, а когда вы продолжаете выполнение, то происходит переключение на окно программы, но оно полностью инвалидировано (стало видно). Поэтому, view вынужден полностью перерисовать свое содержимое. Но он берет, только то что видно в настоящий момент в его viewport.
Записан
AlexNT
Гость
Re: QListView большое количество строк
«
Ответ #9 :
Апрель 30, 2014, 21:43 »
Отключаю обновление QlistView, ui->listView->setUpdatesEnabled(false)
И все равно тормоза начитается. Проблема видимо не QlistView, а в самой модели. Вот я наткнулся на метод QAbstractItemModel::fetchMore, возможно он мне поможет. Но пока не разобрался как им пользоваться.
Записан
Mike-Aiki
Гость
Re: QListView большое количество строк
«
Ответ #10 :
Май 27, 2014, 09:21 »
Возможно, поможет
setUniformRowHeights(true);
«
Последнее редактирование: Май 27, 2014, 09:25 от Mike-Aiki
»
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...