Виджет Qt с прозрачным фоном

(Я использую PySide, но думаю, что ответ будет таким же/похожим для любых языковых привязок).

Я пытаюсь взять пример фигурных часов, расположенный здесь, и сделать циферблат часов (круг) прозрачным, так что все, что я вижу, это стрелки часов и минутные тики. Как бы то ни было, когда пример запускается, он выглядит так: >. Я использую Windows 7.

До сих пор я пробовал следующее (в конструкторе):

  • 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.

person gdw2    schedule 05.10.2011    source источник
comment
Для справки, я думаю, что у виджета есть прозрачный фон, но он явно сидит на чем-то другом, чего нет. Это правильное утверждение?   -  person gdw2    schedule 06.10.2011


Ответы (3)


Понятно!

Это из исходного примера кода (конструктор):

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

Вот модифицированная (и работающая на мой вопрос) версия:

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

Удаление self.windowFlags() было той частью, которую мне не хватало. (Я не совсем уверен, почему мне нужно было удалить это или почему оно было там с самого начала... еще многое предстоит узнать).

person gdw2    schedule 06.10.2011
comment
Хм. Я раньше не слышал о WA_TranslucentBackground. Я попытался добавить его в образец часов и запустил его в KDE, и все, что я получил, — это сплошной черный фон виджета. Что еще вы изменили в коде и какой результат получили? - person HostileFork says dont trust SE; 08.10.2011
comment
Вы заметили изменение выше в строке self.setWindowFlags? - person gdw2; 10.10.2011
comment
Итак, нужно выяснить, какие флаги установлены по умолчанию self.windowFlags(). - person Trilarion; 24.04.2014

Если я правильно помню, вы также должны были установить его таблицу стилей:

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

Надеюсь, это поможет.

person BLeAm    schedule 19.10.2011
comment
Это зависит. Сам виджет имеет прозрачный фон из-за атрибута QtCore.Qt.WA_TranslucentBackground и ему не нужна сама таблица стилей, но дочерние виджеты, содержащиеся в виджете, однако, которые имеют autoFillBackground()==True по умолчанию, должны быть отключены или должны быть установлены QtCore.Qt.WA_TranslucentBackground или действительно, как вы говорите, должны иметь цвет прозрачного фона, заданный таблицей стилей, которая затем наследуется. - person Trilarion; 30.04.2014

в примере с часами это :

void ShapedClock::resizeEvent(QResizeEvent * /* event */)
 {
     int side = qMin(width(), height());
     QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side,
                          side, QRegion::Ellipse);
     setMask(maskedRegion);
 }

"setMask" имеет круглую форму
, но то же самое и в PySide:

def resizeEvent(self, event):
        side = min(self.width(), self.height())
        maskedRegion = QtGui.QRegion(self.width()/2 - side/2, self.height()/2 - side/2, side, side, QtGui.QRegion.Ellipse)
        self.setMask(maskedRegion)

так тоже должно работать?

person KaZ    schedule 06.10.2011
comment
Я немного уточнил свой вопрос. Код, который вы размещаете выше, делает прозрачным все, что находится за пределами циферблата часов, но я пытаюсь сделать сам циферблат прозрачным (все, кроме стрелок часов и минутных отметок). - person gdw2; 06.10.2011