[PyQt] Custom delegates and alternating row colors on QTableView

Phil Thompson phil at riverbankcomputing.com
Sat Jun 5 14:56:40 BST 2010


On Tue, 1 Jun 2010 21:48:09 +0100, Ricardo Cruz <ricardommcruz at gmail.com>
wrote:
> Hi there,
> 
> I'm programming a small finance application and I use QTableViews
> intensively. It happens that for most of these tables I have special
> painting requirements and need a custom delegate. I am using
> QtyledItemDelegate as a base class. One of the things I would like the
> delegate to manage is the painting of alternate colors for each row.
> 
> To achieve that, I used the option parameter of the paint method. This
> object is a QStyleOptionViewItem from which a QStyleOptionViewItemV2 can
be
> created and initiated. The features property of the
QStyleOptionViewItemV2
> would tell me if I am painting an alternate color or not provided the
> alternatingRowColors property of the QTableView is set to True. This way
I
> don't need to implement any alternate color mechanism in my code, I
merely
> detect it and choose a color accordingly.
> 
> The code would be something like;
> 
>     def paint(self, painter, option, index):
>         style = QtGui.QStyleOptionViewItemV2(option)
>         self.initStyleOption(style, index)
> 
>         painter.save()
> 
>         if style.state & QtGui.QStyle.State_Selected:
>             painter.fillRect(option.rect,
> option.palette.highlight().color())
>             painter.setPen(option.palette.highlightedText().color())
>         elif style.features & QtGui.QStyleOptionViewItemV2.Alternate:
>             painter.fillRect(option.rect, QtGui.QColor(246,255,218))
>         else:
>             painter.fillRect(option.rect, QtGui.QColor(191,222,185))
> 
>         QtGui.QStyledItemDelegate.paint(self, painter, option, index)
> 
>         painter.restore()
> 
> However at the moment and since I upgraded to PyQT 4.7.3,

>From what version? Is the version of Qt the same?

> the style.features
> property is not initiated properly and the code is always falling on the
> else statement, which means no alternate colors.
> 
> So my question is if the above code should behave like I was expecting or
> not. It definitely worked before.
> 
> But if not then what is the best way to implement this? Having a custom
> role
> that I can pass to the data method of the model to detect if I am
painting
> an alternate row, or perhaps just use the index.row() to detect even and
> odd
> row numbers, or even use a Style?

Have you got a complete test case?

Phil


More information about the PyQt mailing list