#c #qt5 #qstyleditemdelegate
#c #qt5 #qstyleditemdelegate
Вопрос:
У меня есть несколько пар QIcon
и QString
, отображаемых в QListview
. Все это было настроено с использованием программирования Qt Model / View.
В этом я показываю помеченные значки QListView
. Элементы отображаются с использованием флагов IconMode
, Snap
и TopToBottom
. Таким образом, они организованы в сетку.
Я хотел бы расположить все QListView
элементы вертикально и по центру. Чтобы сделать это, я выделил QStyledItemDelegate
объект в подкласс и перегрузил метод paint. Однако у меня есть три основные проблемы:
- Метки значков были перемещены (в
QStyledItemDelegate
подклассах), и на их первоначальном месте появился квадратный пунктир. - Все стили по умолчанию исчезли (наведение, выделение). Я знаю, как я могу добавить некоторые снова, но я хотел бы использовать стиль по умолчанию (стиль Windows).
- Все отображается в виде сетки, даже если
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
. Оформление выделения работает, но не наведение курсора мыши. И снова в исходном месте метки появляется маленький квадратный пунктир.
У кого-нибудь есть идея? Спасибо за ваши ответы.