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

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

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

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

  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);
  • Метод краски QStyledItemDelegate:
void FramesStyledItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
QStyleOptionViewItemV4 opt = option;
//initStyleOption(&opt, index);

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

QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &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, Выбор украшения работает, но не зависать. Снова, маленький пунктирный квадрат появляется в исходном месте этикетки.

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

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]