Qt5 QStyledItemDelegate в QListView удаляет весь стиль по умолчанию

#c #qt5 #qstyleditemdelegate

#c #qt5 #qstyleditemdelegate

Вопрос:

У меня есть несколько пар QIcon и QString , отображаемых в QListview . Все это было настроено с использованием программирования Qt Model / View.

В этом я показываю помеченные значки QListView . Элементы отображаются с использованием флагов IconMode , Snap и TopToBottom . Таким образом, они организованы в сетку.

Я хотел бы расположить все QListView элементы вертикально и по центру. Чтобы сделать это, я выделил QStyledItemDelegate объект в подкласс и перегрузил метод paint. Однако у меня есть три основные проблемы:

  1. Метки значков были перемещены (в QStyledItemDelegate подклассах), и на их первоначальном месте появился квадратный пунктир.
  2. Все стили по умолчанию исчезли (наведение, выделение). Я знаю, как я могу добавить некоторые снова, но я хотел бы использовать стиль по умолчанию (стиль Windows).
  3. Все отображается в виде сетки, даже если setGridSize не вызывается. Я хотел бы использовать только один «столбец».

Вот фрагмент кода:

  • Извлечение конструктора моего пользовательского QListView :
 setViewMode(QListView::IconMode);
setMovement(QListView::Snap);
setFlow(QListView::TopToBottom);
setSpacing(5);
setIconSize(QSize(iconSize, iconSize));
setGridSize(QSize(iconSize   10, iconSize   10));
setDragEnabled(true);
setAcceptDrops(true);
setDropIndicatorShown(true);
  
  • Метод paint для QStyledItemDelegate :
 void FramesStyledItemDelegate::paint(QPainter* painter, const QStyleOptionViewItemamp; option, const QModelIndexamp; index) const
{
    QStyleOptionViewItemV4 opt = option;
    //initStyleOption(amp;opt, index);

    opt.icon = QIcon();
    opt.text = QString();

    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, amp;opt, painter);

    const QRect r = option.rect;

    QIcon icon = qvariant_cast<QIcon>(index.data(Qt::DecorationRole));
    QString string = qvariant_cast<QString>(index.data(Qt::DisplayRole));
    QPixmap pix = icon.pixmap(r.size());

    const QPoint p = QPoint((r.width() - pix.width())/2, (r.height() - pix.height())/2);

    painter->drawPixmap(r.topLeft()   p, pix);
    painter->drawText(r.center()   p   QPoint(-(string.count() / 2), r.height() / 2), string);
}
  
  • Если я не использую initStyleOption показанный выше, я могу удалить
    пунктирный квадрат, но я теряю все стили по умолчанию.

  • Если я раскомментирую initStyleOption , появится пунктирный квадрат. Я также теряю все стили по умолчанию.

Вот несколько скриншотов:

Нет оформления

Курсор находится на элементе 0 (без оформления при наведении курсора, без оформления выделения).

введите описание изображения здесь

Выбран элемент 0. Появляется маленький квадратик с точкой ( initStyleOption был раскомментирован).

введите описание изображения здесь

Я переключился на ListMode . Оформление выделения работает, но не наведение курсора мыши. И снова в исходном месте метки появляется маленький квадратный пунктир.

У кого-нибудь есть идея? Спасибо за ваши ответы.