1

我想让一个单元格/行看起来像这样QTableView

在此处输入图像描述

运行 Ubuntu 时,QStyledItemDelegate适用于QTreeViewQTableView,但在 Windows 上,它仅适用于QTreeView,并且仅当我不重新实现该paint方法时。

所以我的两个问题是:

我怎样才能QStyledItemDelegate在 a 中看起来像上面的图像QTableView

重新实现时如何QStyledItemDelegate使图像看起来像上图paint

文本旁边的图像不是必需的。我只是在寻找风格化的悬停和选择框。以防万一,我的 Qt 版本是 4.7.2。

4

2 回答 2

1

我在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);
}
}
于 2012-03-14T18:41:30.750 回答
1

我终于想通了。

我没有解决的是为什么不覆盖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's 的绘制方法中。

于 2012-08-29T23:42:04.510 回答