Название: QListView большое количество строк Отправлено: AlexNT от Апрель 29, 2014, 22:01 Доброго времени суток. Начинающий программист на QT, поэтому прошу стазу сильно не пинать :) Понимаю ,что такая проблема у кого то уже была, но не могу найти ответ. Так что ткните носом куда рыть.
Есть модель наследник от QAbstractListModel, данные в модели хранятся в QVector. Отображение QListView. Программа слушает шину данных и выводит пакеты в QListView. В секунду может быть до 2000 пакетов. Пока количество пакетов пришло не большое, до 10 000 все нормально, но потом начинаются тормоза. Понимаю, что модель должна как то отобразить определенное количество данных, а все остальной только при прокрутке в QListView. Куда рыть? Название: Re: QListView большое количество строк Отправлено: Old от Апрель 29, 2014, 22:05 А какой средний размер пакета? Как храните данные в векторе (как указатели на пакеты)?
Название: Re: QListView большое количество строк Отправлено: AlexNT от Апрель 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) Название: Re: QListView большое количество строк Отправлено: Old от Апрель 29, 2014, 22:14 Используйте вместо вектора QList.
Название: Re: QListView большое количество строк Отправлено: AlexNT от Апрель 29, 2014, 22:28 Используйте вместо вектора QList. Пробовал. Все равно тормоза. Скорее всего подозреваю что каждый раз при добавлении нового элемента в QList, перерисовываются все данные в отображение. Название: Re: QListView большое количество строк Отправлено: Old от Апрель 29, 2014, 22:42 Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели.
Название: Re: QListView большое количество строк Отправлено: AlexNT от Апрель 29, 2014, 23:00 Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели. Дело в том что я делаю такой эксперимент. Запускаю прослушивание шины, накапливаю данные (пакеты) QList. Затем останавливаю прослушивание шины данных. То есть данные в QList больше не добавляются. Теперь в методе модели который отвечает за отображение данных QVariant QModel::data(const QModelIndex &index, int role) const ставлю точку останова, и пытаюсь сделать какие то действия с окном программы (или перетаскивание или делаю фокус на окно), и я вижу, что по каждому действию начинается вывод всех данных из QList, даже тех которые не видно (находятся за прокруткой). Из этого я и сделал вывод, что так же и при добавление нового элемента, и вывод в отображение, выводятся все данные из QList заново. Название: Re: QListView большое количество строк Отправлено: Bepec от Апрель 29, 2014, 23:45 А у вас никакого свойства типа "размер содержимого по размеру самой большой строки" не установлено? Вроде бы имелся такой функционал у List'View. Он тогда да - перерывает все элементы.
PS а так более 1кк элементов все View уже не переваривают. Название: Re: QListView большое количество строк Отправлено: Old от Апрель 30, 2014, 06:35 Дело в том что я делаю такой эксперимент. Это не совсем правильная проверка.Если вы ставите точку останова, то происходит переключение на окно отладчика, а когда вы продолжаете выполнение, то происходит переключение на окно программы, но оно полностью инвалидировано (стало видно). Поэтому, view вынужден полностью перерисовать свое содержимое. Но он берет, только то что видно в настоящий момент в его viewport. Название: Re: QListView большое количество строк Отправлено: AlexNT от Апрель 30, 2014, 21:43 Отключаю обновление QlistView, ui->listView->setUpdatesEnabled(false)
И все равно тормоза начитается. Проблема видимо не QlistView, а в самой модели. Вот я наткнулся на метод QAbstractItemModel::fetchMore, возможно он мне поможет. Но пока не разобрался как им пользоваться. Название: Re: QListView большое количество строк Отправлено: Mike-Aiki от Май 27, 2014, 09:21 Возможно, поможет
setUniformRowHeights(true); |