Access to QBrush gradient

Maurizio Berti <[email protected]> Sun, 26 Apr 2020 08:42:46 +0200
Newsgroups gmane.comp.python.pyqt-pykde
Message-ID <CAPn+-XTJ+2iFMmzQMpATukr0m9Uq5Jg4Q8ytv9gXNcQ+p9jRhw@mail.gmail.com>
Hello,

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
AttributeError:

>>> 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
True

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()
225.0

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.

Maurizio

-- 
È difficile avere una convinzione precisa quando si parla delle ragioni del
cuore. - "Sostiene Pereira", Antonio Tabucchi
http://www.jidesk.net

_______________________________________________
PyQt mailing list    [email protected]
https://www.riverbankcomputing.com/mailman/listinfo/pyqt