59 / 35 / 8
Регистрация: 06.06.2013
Сообщений: 145
|
||||||||||||||||
1 | ||||||||||||||||
QTableView с большим количеством ячеек08.05.2017, 13:36. Показов 4408. Ответов 8
Метки нет (Все метки)
Собственно, тормозит, не пойму, почему. Пока тестировал 3-5 столбцов и 5-10 строк - все работало отлично. Но когда работаю с 200 строками - все подвисает на несколько секунд прежде, чем отрисовывается. В будущем мне придется записывать таблицы в несколько тысяч строк и 10-20 столбцов. Допускаю, что программа при этом будет подтормаживать, но не настолько же.
Теперь поподробнее. Предполагается, что QTableWidget *wTable будет отображать вектор данных, который состоит из такой структуры.
Для определенности привожу два метода. Первый добавляет столбец в таблицу, второй перерисовывает рабочую область таблицы. Установил, что проблема кроется во втором методе. Если оставить все как есть - новый столбец добавляется секунд за 10-12. Если закомментировать цикл - время сокращается вдвое. То есть просто стирание и запись новых координат уже требует огромного количества времени. Слышал, что для таблиц свыше 500 строк рекомендуют использовать QTableView, но пока я не приступил к переделке кода, хотелось бы понять причину проблемы и как грамотно написать через QTableView, чтобы работало быстрее готового виджета с таблицей.
0
|
08.05.2017, 13:36 | |
Ответы с готовыми решениями:
8
Qwt. График с большим количеством точек Установить размер ячеек QTableView QTableView::setSpan выделение объединенных ячеек QTableView рамка для групп ячеек |
08.05.2017, 15:51 | 2 |
Сообщение было отмечено Anvis как решение
Решение
Anvis, Нет ничего удивительного, что у вас всё подвисает. Вы совершаете настолько огромное количество операций, что даже хороший компьютер будет их считать достаточно больше время.
QTableWidget предназначен для того, чтобы хранить данные в нём. Если данные хранятся где-то ещё, как у вас, то имеет смысл делать QTableView + переопределять QAbstractTableModel, где и хранить данные. Касательно же приведённого кода, то ошибка тут в том, что вы вместо использования QTableWidget::insertColumn(и дальнейшего забивания данными только ячеек созданного столбца), делаете свой тормозной велосипед, где полностью пересоздаёте таблицу.
1
|
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
|
|
08.05.2017, 15:56 | 3 |
А зачем ты её всю очищаешь и перезаполняешь? Добавил столбец - его и заполняй.
0
|
59 / 35 / 8
Регистрация: 06.06.2013
Сообщений: 145
|
|
08.05.2017, 16:33 [ТС] | 4 |
refreshTable() используется не только в этом методе. Плюс хотел сделать код более читаемым и даже не думал, что перерисовка таблицы с 600 ячейками будет занимать столько времени. Так или иначе, даже если просто добавлю еще один столбец - все равно при добавлении 400 итемов начнутся лаги, так?
Понятно, буду думать, как сделать через QAbstractTableModel. Может этот вопрос и отпадет сам собой, но пока мне не понятно, где именно у меня много операций. Операция создания итема? Удаление итемов?
0
|
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
|
|
08.05.2017, 17:01 | 5 |
Будет в любом случае быстрее в несколько раз.
Уже сказали, что лучше использовать модель и QTableView. Добавлено через 48 секунд Чтобы определить, где там медленнее, надо замеры делать.
1
|
59 / 35 / 8
Регистрация: 06.06.2013
Сообщений: 145
|
|
10.05.2017, 01:54 [ТС] | 7 |
Ну вот, пытаюсь въехать в логику моделей и что именно мне нужно переопределять. Допустим, есть горизонтальный хедер. Нужно ли мне переопределять setHeaderData при условии, что первые два столбца у меня с фиксированным названием, а остальные с изменяемым, причем их количество может меняться? А если надо - как быть со вторым параметром Qt::Orientation orientation? В смысле, если он вертикальный, а не горизонтальный. Игнорировать? Дописать еще одно поле, хранящее в себе номера строк и менять его? Хотелось бы оставить сквозную нумерацию строк.
То ли к этому надо привыкнуть, то ли с QTableWidget было проще.
0
|
7803 / 6567 / 2988
Регистрация: 14.04.2014
Сообщений: 28,706
|
|
10.05.2017, 10:54 | 8 |
setHeaderData() для вертикальной ориентации можно вообще не определять, если ты не собираешься там что-то специфическое выводить.
1
|
10.05.2017, 12:56 | 9 |
Почитайте соответствующие статьи из документации по моделям Qt и посмотрите примеры. Сами найдёте или ссылку дать?
setHeaderData нужно переопределять только в случае, если вы изменяете данные в заголовке вне модели. Если хедеры изменяются только внутри модели, то вам нужно изменить их и вызвать соответствующий сигнал headerDataChanged , по которому кому надо подгрузят исправленные заголовки с помощью функции headerData .Что вам непонятно насчёт параметра Qt::Orientation orientation и реализации нумерации строк в качестве вертикальных заголовков? Описание функции headerData читали? Там ведь всё понятно написано. Если с английским не знакомы, так всегда есть онлайн-переводчики. Более того, реализация данной функции неоднократно разобрана в примерах.
0
|
10.05.2017, 12:56 | |
10.05.2017, 12:56 | |
Помогаю со студенческими работами здесь
9
Как поменять размер ячеек в QTableView Чтение содержимого ячеек из QTableView в QLineEdit QTableView/QTableWidget drag drop перенос строк и ячеек Как выводить данные ячеек в их ToolTip-ы в QSqlQueryModel с QTableView? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |