Russian Qt Forum

Qt => Model-View (MV) => Тема начата: AlexNT от Апрель 29, 2014, 22:01



Название: 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);