PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?
Posted
技术标签:
【中文标题】PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?【英文标题】:PyQt: QStyledItemDelegate in QTableView on Windows Vista/7? 【发布时间】:2011-10-22 14:33:55 【问题描述】:我想让一个单元格/行在QTableView
中看起来像这样:
运行 Ubuntu 时,QStyledItemDelegate
适用于 QTreeView
和 QTableView
,但在 Windows 上,它仅适用于 QTreeView
,并且只有在我不重新实现 paint
方法的情况下。
所以我的两个问题是:
如何让QStyledItemDelegate
在QTableView
中看起来像上图?
在重新实现paint
时,如何使QStyledItemDelegate
看起来像上图?
文字旁边的图片不是必要的。我只是在寻找风格化的悬停和选择框。 以防万一,我的 Qt 版本是 4.7.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);
【讨论】:
【参考方案2】:我终于想通了。
我没有解决的是为什么不覆盖 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
的绘制方法中。
【讨论】:
以上是关于PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 中从我的 VS2008/C++ 应用程序中执行一个程序来替换调用者并在 xp/vista/7 上运行?
Windows Vista/7:如何对输出音频混合进行采样?
在 Windows Vista/7 中支持回声消除的 API