[PyQt] Access to QBrush gradient

Phil Thompson phil at riverbankcomputing.com
Sun Apr 26 09:34:59 BST 2020

On 26/04/2020 07:42, Maurizio Berti wrote:
> 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

I can fix that so the conversion is done automatically.


More information about the PyQt mailing list