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

当运行Ubuntu时,QStyledItemDelegate同时适用于QTreeView和QTableView,但在Windows上,它只能在QTreeView上工作,而且只有在我不重新实现paint方法的情况下才能工作。
所以我的两个问题是:
如何使QStyledItemDelegate在QTableView中看起来像上面的图像
如何在重新实现QStyledItemDelegate时使paint看起来类似于上面的映像
文本旁边的图像是而不是所必需的。我只是在寻找风格悬停和选择框。以防万一,我的Qt版本是4.7.2。
发布于 2012-08-29 23:42:04
我终于想够了。
我没有解决的是,为什么不重写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的油漆方法中。
发布于 2012-03-14 18:41:30
我在qtcentre上打开了一个请求相同内容的帖子。回答我问题的人给我提供了一个用C++编写的代码示例和显示结果的图片。它在C++中似乎运行得很好,但在PySide中却不起作用(不知道pyQt),所以它可能是个bug。
这是工作代码:
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);
}
}https://stackoverflow.com/questions/7860271
复制相似问题