Рисование самостоятельно не обязательно, но пользовательский делегат - есть. Делитель элемента стиля использует код чертежа элемента управления стилем для рисования CE_ItemViewItem
- см. the source code for Qt 5.5.0. Код чертежа принимает параметр стиля decorationAlignment
. К сожалению, нет роли данных, которая бы соответствовала реализации стиля. Вместо этого, вы должны переопределить выравнивание в делегате:
class DecorationAligningDelegate : public QStyledItemDelegate {
Q_OBJECT
Qt::Alignment const m_alignment;
public:
explicit DecorationAligningDelegate(Qt::Alignment alignment, QObject * parent = 0) :
QStyledItemDelegate(parent), m_alignment(alignment) {}
Qt::Alignment alignment() const { return m_alignment; }
void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const {
auto opt = option;
opt.decorationAlignment = m_alignment;
QStyledItemDelegate::paint(painter, opt, index);
}
};
Затем к центру эскизов:
view.setItemDelegateForColumn(0,
new DecorationAligningDelegate(Qt::AlignHCenter, &view));
//or
view->setItemDelegateForColumn(0,
new DecorationAligningDelegate(Qt::AlignHCenter, view));
Если вы действительно хотели, чтобы нарисовать все это самостоятельно, даже если в этом нет необходимости, прямоугольника предмета, подлежащего окраске, указывается в опции стиля (option.rect
). Чтобы нарисовать пиксельную карту, расположенной в центре прямоугольника элемента, вы можете сделать следующее:
QStyleOption option;
QPixmap pix;
QPainter painter;
...
painter.save();
auto loc = option.rect.center() - pix.rect().center()
painter.drawPixmap(loc, pix);
painter.restore();
Итак, я должен использовать делегат? –
@MohamedAnwer Да, вы делаете, но делегат тривиален и ничего не рисует сам по себе. Я показал полный источник делегата, который выполняет такое выравнивание, и как установить его в нужной колонке. Это простой способ обхода кода Qt и стиля. –
Я сделал точно первый фрагмент кода, и вертикальное выравнивание исчезло, и до сих пор нет горизонтального выравнивания, Я изменил Qt :: AlignHCenter на (Qt :: AlignHCenter | Qt :: AlignVCenter), и снова появилось вертикальное выравнивание , но все равно не горизонтальное выравнивание, Что вы думаете сейчас? –