Hi folks,
I'd like to write an application (Windows, Linux and Mac OS X) having a (per pixel) transparent top-level widget.
Some might say that I can use masks for that. But I can't. The fact is that the mask would change very often (I have some animated widgets) and updating a widget mask costs way TOO much!
Ok, googling for it, I've found this: http://trolltech.com/developer/faqs/...-08.3940505976
In short terms, the FAQ page says that Qt doesn't support this, but there are platform-dependent ways to achieve this goal, and I'd like to implement them!
For Linux, it's pretty much straighforward. Instancing an QApplication with a X Display that supports Composite gives you the ability to clear a widget on its paintEvent() to Qt::transparent. You can, then, paint any widgets on it and you'll have a "floating widgets" visual (this is what I'm looking for).
On Windows, it says to use the UpdateLayeredWindow() function, DOT. Wow, great, this is the magical function that will save my neck! Hell God, how to use it???
I'd like to thank the kernel_panic user, who used this function on his QSkinWindows to achieve transparency. The method is very likely the Linux one: on paintEvent(), create a QPixmap, clear it to Qt::transparent, draw your child widgets on it, then display it on your widget using UpdateLayeredWindow(). The resultant widget is exactly like I want.
On Mac OS X, you may use the kOverlayWindowClass for this. And my "lost measurement" light just shone brighter than when I read the Windows way... It says that one would have to modify Qt to use this WindowClass. I thought that modding QtGui (src/gui/kernel/qwidget_mac.cpp) to use this WindowClass for EVERY CreateNewWindow call (line 420 for Qt 4.4.3 src) would work and I would only have to make my top-level widget have a 0% opacity and draw full-opaque child widgets on top of it to achieve my goal. It just didn't worked AND caused some crashes, geez.
There are some Apple samples on how to use kOverlayWindowClass, and the results are windows with the effect I'd like to have. But I don't see a way to integrate a Carbon-created window with my Qt widgets...
Can anyone help me on how to mod (and use) Qt to achieve this goal OR how to integrate a external Carbon window with Qt widgets?
Thanks in advance!
Bookmarks