[Qt-interest] Trying To Understand Transparent Background
Cheung Yik Pang
yp.cheung at valueplatforms.com
Mon Oct 5 13:02:43 CEST 2009
Girish Ramakrishnan wrote:
> Cheung Yik Pang wrote:
>
>> Girish Ramakrishnan wrote:
>>
>>> Cheung Yik Pang wrote:
>>>
>>>
>>>> Girish Ramakrishnan wrote:
>>>>
>>>>
>>>>> Cheung Yik Pang wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Hi all,
>>>>>>
>>>>>> I have a questions about using transparent color as background
>>>>>> color of
>>>>>> widgets.
>>>>>>
>>>>>> My little test program basically move a blue widget around in a
>>>>>> transparent widget for every 5 seconds. Both widgets had
>>>>>> autoFillBackground set to true.
>>>>>>
>>>>>> My expectation is that when the blue widget moved from area A to
>>>>>> area B
>>>>>> in the parent widget, area A will be cleared with transparent color
>>>>>> and
>>>>>> area B will be blue. But what I get is both area A and area B became
>>>>>> blue.
>>>>>>
>>>>>> I have tried the new 4.5.3 and the 4.6 git head on Windows. Both have
>>>>>> the same result.
>>>>>>
>>>>>>
>>>>> What you are seeing is expected behavior. Maybe you can tell us what
>>>>> are
>>>>> you trying to achieve? Are you trying to make your window transparent
>>>>> i.e one can see through your window? If so, this is not the correct
>>>>> approach - see WA_TranslucentWindow.
>>>>>
>>>>> Girish
>>>>>
>>>>>
>>>> Thank you for replying.
>>>>
>>>> And yes, I am trying to have a transparent window. Frankly, I am a
>>>> little bit confused.
>>>>
>>>> Qt::WA_TranslucentBackground implies WA_NoSystemBackground, which means
>>>> I need to fill the background with Qt::transparent in every
>>>> paintEvent(), right? But how is it different from
>>>> setAutoFillBackground(true) with QPalette::Window set to
>>>> Qt::transparent?
>>>>
>>>>
>>>>
>>> That's correct. Here's how I can explain the situation in the X11 world.
>>> With WA_TranslucentBackground, you ask Qt to choose ARGB visuals for
>>> your application window (I think in the Windows world it's called a
>>> 'transparent' layer or something). Without ARGB visuals and a
>>> compositing windowing manager, top level transparency does not work.
>>>
>>> Now, you can argue that you want setting a Qt::transparent background to
>>> automatically imply WA_TranslucentBackground but the fact is that it
>>> isn't that way :) Qt simply hasn't been special cased for tlw/windows
>>> having a autofillbackground with a non-opaque color. You can report a
>>> bug, if you like.
>>>
>>>
>> Ah, so WA_TranslucentBackground affects windows management, instead of
>> the widget itself. That explains a lot. Thanks :)
>>
>>
>>
>>>
>>>
>>>> And let's forget about the transparent window thing for a minute. Why
>>>> does Qt refuse to fill the background if QPalette::Window is
>>>> Qt::tranpsarent, but not Qt::black?
>>>>
>>>>
>>>>
>>> As I said above, autoFillBackground with non-opaque colors doesn't work
>>> on tlw/windows. The consequence is that in the absence of argb visuals,
>>> your background is basically garbage since your app doesn't clear the
>>> existing background after expose.
>>>
>>>
>> So I take this as: If the native window manager is not aware of the
>> alpha channel of the widget, whatever native call fillRect() maps to
>> will take no effect for non-opaque colors. Right?
>>
>>
>
> Almost right. It does have an effect, you just end up painting a
> transparent color over garbage :) You can verify this is painting with
> some transparent color (you should cause I haven't :)).
>
> Girish
>
If that's how Qt rolls, I would not object to that. Thank you for
explaining the details :)
Although I think that it would be nice if autoFillBackground actually
meant filling the background, not blending onto it :(
Regards,
Cheung
More information about the Qt-interest-old
mailing list