Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt Widget with Transparent Background

(I'm using PySide, but I think the answer would be the same/similar for any language bindings).

I'm trying to take the shaped clock example, located here, and cause the face of the clock (circle) to be transparent so that all I see are the clock hands and minute ticks. As is, when the example runs, it looks like this. I'm using Windows 7.

So far, I've tried the following (in the constructor):

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • Clock appears (has presence in task bar), but I can't see it anywhere
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • Clock appears, but has solid black background.
  • self.setWindowOpacity(0.5)
    • Clock appears, but entire clock is transparent. I want the background (face) to be transparent, but I want the clock hands to be visible.
like image 352
gdw2 Avatar asked Oct 05 '11 20:10

gdw2


People also ask

What is Qtwidgets?

Widgets are the primary elements for creating user interfaces in Qt. Widgets can display data and status information, receive user input, and provide a container for other widgets that should be grouped together. A widget that is not embedded in a parent widget is called a window.


2 Answers

Got it!

This is from the original example code (constructor):

    ...
    self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint)
    ...

Here is the modified (and working per my question) version:

    ...
    self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
    self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    ...

Removing the self.windowFlags() was the part I was missing. (I'm not exactly sure why I needed to remove this or why it was there to begin with... still much to learn).

like image 171
gdw2 Avatar answered Sep 23 '22 16:09

gdw2


If I remember correctly, you should have set its stylesheet also:

self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
self.setStyleSheet("background:transparent;")

Hope that helps.

like image 35
BLeAm Avatar answered Sep 23 '22 16:09

BLeAm