[PyQt] Access to QBrush gradient

Maurizio Berti maurizio.berti at gmail.com
Sun Apr 26 07:42:46 BST 2020


this was meant to be a question, but after some thinking and testing, I
found a solution for my doubt on my own, and since I believe it might be
helpful to know this, I thought it would be good to share it with you.

I was trying to access (and, possibly, update) the gradient of a QBrush.
The problem is that QBrush.gradient() just returns a basic QGradient, and
not the actual gradient class used in its construction.
The result is that you won't be able to access the gradient functions (for
example, the angle of a conical gradient) since it obviously results in an

>>> grad = QtGui.QConicalGradient(.5, .5, 225)
>>> brush = QtGui.QBrush(grad)
>>> brush.gradient().angle()
AttributeError: 'QGradient' object has no attribute 'angle'
>>> brush.gradient()
<PyQt5.QtGui.QGradient at 0x7f941a28c2d0>
>>> brush.gradient().type() == QtGui.QGradient.ConicalGradient

By looking at the Qt C++ sources, gradient() just returns a standard
QGradient indeed, "filled in" with the QBrush data, so it's not a PyQt
issue: Qt just does that.

I don't know if there's a specific reason for this (maybe something related
to performance).

After closely looking at the sources of QBrush again, though, I realized
that the gradient is "cast" when needed, so I gave it a try by using
sip.cast; it works:

>>> import sip
>>> brushGrad = sip.cast(brush.gradient(), QtGui.QConicalGradient)
>>> brushGrad.angle()

Obviously you have to check the gradient().type() before, and cast the
correct gradient afterwards, otherwise the values won't make much sense: in
the case above a cast on a QLinearGradient will result in the finalStop
having coordinates (255, 0).

I hope this helps.


È difficile avere una convinzione precisa quando si parla delle ragioni del
cuore. - "Sostiene Pereira", Antonio Tabucchi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20200426/f6d44a24/attachment.htm>

More information about the PyQt mailing list