Как в Qt создать кастомный элемент для QListView\QListWidget

160
09 июля 2018, 22:00

Необходимо создать список виджетов (большой), в каждом виджете списка имеются кнопки\чекбоксы и т.д. как это сделать правильно? сейчас имеется костыльная реализация через установку виджета в список функцией - QListWidget::setItemWidget(QListWidgetItem *item, QWidget *widget); Но этот вариант весьма тормозной.

Элементы списка выглядят примерно так:

Answer 1

Для начала попробуйте банально заменить 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 делегата - я не пробовал.

READ ALSO
Посчитать кол-во слов в строке из файла

Посчитать кол-во слов в строке из файла

Есть текстовый файл, в котором записано несколько строкСлова разделены пробелами

205
Считывание из файла С++

Считывание из файла С++

После считывания из файла, у меня считывается строка с символом перехода на новую строку, в итоге при попытке узнать длину строки выводит...

199
С какой точки считается margin-left?

С какой точки считается margin-left?

С какого угла? Или с середины?

168