2015-08-16 8 views
1

У меня QTableView, который работает очень хорошо, первый столбец содержит несколько эскизов, в каждой ячейке этого столбца миниатюры вертикально центрированы, но не по горизонтали.Картина QPixmap в центре ячейки QTableView

Нужно ли мне использовать делегат? Если да, как центрировать их по горизонтали, используя QStyledItemDelegate?

ответ

2

Рисование самостоятельно не обязательно, но пользовательский делегат - есть. Делитель элемента стиля использует код чертежа элемента управления стилем для рисования 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(); 
+0

Итак, я должен использовать делегат? –

+0

@MohamedAnwer Да, вы делаете, но делегат тривиален и ничего не рисует сам по себе. Я показал полный источник делегата, который выполняет такое выравнивание, и как установить его в нужной колонке. Это простой способ обхода кода Qt и стиля. –

+0

Я сделал точно первый фрагмент кода, и вертикальное выравнивание исчезло, и до сих пор нет горизонтального выравнивания, Я изменил Qt :: AlignHCenter на (Qt :: AlignHCenter | Qt :: AlignVCenter), и снова появилось вертикальное выравнивание , но все равно не горизонтальное выравнивание, Что вы думаете сейчас? –

1

Построить свой собственный делегат и наследовать QStyledItemDelegate. Переопределите метод рисования.

Затем сделать что-то вроде этого:

void 
MyDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, 
          const QModelIndex& index) const 
{ 

    QPixmap pixmap; 
    pixmap.load("Your pixmap file path"); 
    pixmap = pixmap.scaled(option.rect.width(), option.rect.height(), Qt::KeepAspectRatio); 

    // Position our pixmap 
    const int x = option.rect.center().x() - pixmap.rect().width()/2; 
    const int y = option.rect.center().y() - pixmap.rect().height()/2; 

    if (option.state & QStyle::State_Selected) { 
     painter->fillRect(option.rect, option.palette.highlight());   
    } 

    painter->drawPixmap(QRect(x, y, pixmap.rect().width(), pixmap.rect().height()), pixmap); 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^