【问题标题】:PyQt: QStyledItemDelegate in QTableView on Windows Vista/7?PyQt:Windows Vista/7 上 QTableView 中的 QStyledItemDelegate?
【发布时间】:2023-03-13 18:44:01
【问题描述】:

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

运行 Ubuntu 时,QStyledItemDelegate 适用于 QTreeViewQTableView,但在 Windows 上,它仅适用于 QTreeView,并且只有在我不重新实现 paint 方法的情况下。

所以我的两个问题是:

如何让QStyledItemDelegateQTableView 中看起来像上图?

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

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

【问题讨论】:

    标签: python windows qt pyqt qtableview


    【解决方案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的绘制方法中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2012-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多