Qt Widget с прозрачным фоном - PullRequest
       8

Qt Widget с прозрачным фоном

4 голосов
/ 06 октября 2011

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

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

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

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • Часы появляются (присутствует на панели задач), но я их нигде не вижу
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • Часы появляются, но имеют сплошной черный фон.
  • self.setWindowOpacity(0.5)
    • Часы появляются, но все часы прозрачны. Я хочу, чтобы фон (лицо) был прозрачным, но я хочу, чтобы стрелки часов были видны.

Ответы [ 3 ]

5 голосов
/ 19 октября 2011

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

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

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

4 голосов
/ 06 октября 2011

Понял!

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

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

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

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

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

1 голос
/ 06 октября 2011

в примере с часами:

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)

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

...