[Qt-interest] Trying To Understand Transparent Background
Cheung Yik Pang
yp.cheung at valueplatforms.com
Mon Oct 5 07:01:10 CEST 2009
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?
Regards,
Cheung
> Girish
>
More information about the Qt-interest-old
mailing list