Необходимо создать список виджетов (большой), в каждом виджете списка имеются кнопки\чекбоксы и т.д. как это сделать правильно? сейчас имеется костыльная реализация через установку виджета в список функцией - QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget);
Но этот вариант весьма тормозной.
Элементы списка выглядят примерно так:
Для начала попробуйте банально заменить QListView
на QVBoxLayout
в QScrollArea
. Вполне возможно, что стандартные механизмы Qt самостоятельно справятся с большим количеством виджетов, там вроде бы есть механизмы, позволяющие не рисовать невидимые элементы, а setItemWidget
вполне может их игнорировать.
Если не поможет - попробуйте использовать Model-View. Создайте модель, которая для каждой строки будет хранить отображающий её виджет без родителя и отрисовывайте её в методе paint
делегата при помощи QWidget::render
, примерно так:
QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override{
auto data = index.data().value<RowStruct>();
return ret = data.widget->sizeHint();
}
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override{
auto data = index.data().value<RowStruct>();
auto point = painter->deviceTransform().map(option.rect.topLeft());
data.widget->render(painter,point, QRect(QPoint{}, option.rect.size()), QWidget::RenderFlag::DrawChildren);
}
Само по себе большое количество виджетов тут не проблема - главное, чтобы они не отрисовывались все сразу, что обеспечивается View
. На крайний случай можно вручную следить за отображаемыми виджетами и удалять лишние.
Основная проблема - это редактирование. Сделать сам виджет доступным для редактирования не проблема - достаточно возвращать его из createEditor
делегата, назначив родителя. Но триггеры редактирования в Q**View - это двойной щелчок мышью и подобные. Возможно, поможет переопределение event
или eventFilter
делегата - я не пробовал.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть текстовый файл, в котором записано несколько строкСлова разделены пробелами
После считывания из файла, у меня считывается строка с символом перехода на новую строку, в итоге при попытке узнать длину строки выводит...