Russian Qt Forum
Май 13, 2024, 04:01 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QListView большое количество строк  (Прочитано 6231 раз)
AlexNT
Гость
« : Апрель 29, 2014, 22:01 »

Доброго времени суток. Начинающий программист на QT, поэтому прошу стазу сильно не пинать Улыбающийся Понимаю ,что такая проблема у кого то уже была, но не могу найти ответ. Так что ткните носом куда рыть.

Есть модель наследник от QAbstractListModel, данные в модели хранятся в QVector. Отображение QListView. Программа слушает шину данных и выводит пакеты в QListView. В секунду может быть до 2000 пакетов. Пока количество пакетов пришло не большое, до 10 000 все нормально, но потом начинаются тормоза. Понимаю, что модель должна как то отобразить определенное количество данных, а все остальной только при прокрутке в QListView. Куда рыть?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Апрель 29, 2014, 22:05 »

А какой средний размер пакета? Как храните данные в векторе (как указатели на пакеты)?
Записан
AlexNT
Гость
« Ответ #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 Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Апрель 29, 2014, 22:14 »

Используйте вместо вектора QList.
Записан
AlexNT
Гость
« Ответ #4 : Апрель 29, 2014, 22:28 »

Используйте вместо вектора QList.


Пробовал. Все равно тормоза. Скорее всего подозреваю что каждый раз при добавлении нового элемента в QList, перерисовываются все данные в отображение.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Апрель 29, 2014, 22:42 »

Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели.
Записан
AlexNT
Гость
« Ответ #6 : Апрель 29, 2014, 23:00 »

Нет. Перерисовавается только изменяемые элементы. Вы сможете это проверить печатая что-то в лог при вызове метода data модели.


Дело в том что я делаю такой эксперимент. Запускаю прослушивание шины, накапливаю данные (пакеты) QList. Затем останавливаю прослушивание шины данных. То есть данные в QList больше не добавляются. Теперь в методе модели который отвечает за отображение данных

QVariant QModel::data(const QModelIndex &index, int role) const

ставлю точку останова, и пытаюсь сделать какие то действия с окном программы (или перетаскивание или делаю фокус на окно), и я вижу, что по каждому действию начинается вывод всех данных из QList, даже тех которые не видно (находятся за прокруткой). Из этого я и сделал вывод, что так же и при добавление нового элемента, и вывод в отображение, выводятся все данные из QList заново.
Записан
Bepec
Гость
« Ответ #7 : Апрель 29, 2014, 23:45 »

А у вас никакого свойства типа "размер содержимого по размеру самой большой строки" не установлено? Вроде бы имелся такой функционал у List'View. Он тогда да - перерывает все элементы.

PS а так более 1кк элементов все View уже не переваривают.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Апрель 30, 2014, 06:35 »

Дело в том что я делаю такой эксперимент.
Это не совсем правильная проверка.
Если вы ставите точку останова, то происходит переключение на окно отладчика, а когда вы продолжаете выполнение, то происходит переключение на окно программы, но оно полностью инвалидировано (стало видно). Поэтому, view вынужден полностью перерисовать свое содержимое. Но он берет, только то что видно в настоящий момент в его viewport.
Записан
AlexNT
Гость
« Ответ #9 : Апрель 30, 2014, 21:43 »

Отключаю обновление QlistView, ui->listView->setUpdatesEnabled(false)
И все равно тормоза начитается. Проблема видимо не QlistView, а в самой модели. Вот я наткнулся на метод QAbstractItemModel::fetchMore, возможно он мне поможет. Но пока не разобрался как им пользоваться.
Записан
Mike-Aiki
Гость
« Ответ #10 : Май 27, 2014, 09:21 »

Возможно, поможет
setUniformRowHeights(true);
« Последнее редактирование: Май 27, 2014, 09:25 от Mike-Aiki » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 23.