PyQt: QStyledItemDelegate в QTableView в Windows Vista / 7? - PullRequest
1 голос
/ 22 октября 2011

Я бы хотел, чтобы ячейка / строка выглядели так: QTableView:

enter image description here

При запуске Ubuntu QStyledItemDelegate работает как для QTreeView, так и для QTableView, но в Windows он работает только на QTreeView, и только если я не переопределяю метод paint.

Итак, мои 2 вопроса:

Как мне заставить QStyledItemDelegate выглядеть, как на картинке выше в QTableView?

Как заставить QStyledItemDelegate выглядеть как на картинке выше при переопределении paint?

Изображение рядом с текстом не обязательно. Я просто ищу стилизованное поле для наведения и выбора. На всякий случай, если это необходимо, моя версия Qt 4.7.2.

Ответы [ 2 ]

1 голос
/ 30 августа 2012

Я наконец понял, достаточно ли этого.

Я не решил, почему не переопределение QStyledItemDelegate.paint() имеет эффект, отличный от переопределения, например:

def paint(self, painter, option, index):
    QStyledItemDelegate.paint(self, painter, option, index)

но это все равно не было частью моего вопроса.


То, что я действительно решил, - как получить нативный внешний вид при рисовании вручную. Ранее при рисовании предмета я использовал:
QApplication.style().drawControl(QStyle.CE_ItemViewItem, option, painter)

, в которой возникла проблема не рисовать родной фокус или выделение. Я посмотрел на сигнатуру метода QApplication.style().drawControl():

void QStyle::drawControl ( ControlElement element, const QStyleOption * option,
                           QPainter * painter, const QWidget * widget = 0 )

и заметил параметр widget, и попытался передать QTreeView. Это сработало. Неважно, что QTreeView передано, но это делает представление визуализированным изначально.

Итак, в итоге рендеринг нативного QTableView так же прост, как и вызов:

QApplication.style().drawControl(QStyle.CE_ItemViewItem, option, painter, QTreeView())

в методе QStyledItemDelegate.

1 голос
/ 14 марта 2012

Я открыл тему на qtcentre , требуя того же.Парень, который ответит мне, предоставит мне пример кода, написанный на C ++, и рисунок, показывающий результат.Кажется, он отлично работает в C ++, но не в PySide (не знаю о pyQt), поэтому это может быть ошибка.

Это рабочий код:

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

if( index.column() == 1 )
{
int progress = index.data().toInt();

QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.rect.setTop( option.rect.top() + 1 );
progressBarOption.rect.setHeight( option.rect.height() - 2 );
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
progressBarOption.textAlignment = Qt::AlignCenter;

QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
}
}
...