透明背景的Qt控件

9 投票
3 回答
26058 浏览
提问于 2025-04-17 03:44

(我在使用PySide,不过我觉得这个答案在任何语言绑定中都差不多。)

我正在尝试使用一个叫做“形状时钟”的例子,具体代码可以在这里找到。我想让时钟的表盘(圆形部分)变得透明,这样我只看到时钟的指针和分钟刻度。目前这个例子运行起来的样子是这样的。我使用的是Windows 7。

到目前为止,我尝试了以下几种方法(在构造函数中):

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • 时钟出现了(在任务栏中有显示),但我在任何地方都看不见它。
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • 时钟出现了,但背景是实心的黑色。
  • self.setWindowOpacity(0.5)
    • 时钟出现了,但整个时钟都是透明的。我想要的是背景(表盘)透明,但时钟的指针要能看得见。

3 个回答

1

在这个时钟的例子中,有:

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)

那这样的话也应该能用吧?

7

如果我没记错的话,你应该也要设置它的样式表:

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

希望这能帮到你。

12

明白了!

这是原始示例代码的一部分(构造函数):

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

这是我根据问题修改过的(并且能正常工作的)版本:

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

我漏掉的部分是去掉了 self.windowFlags()。我不太确定为什么需要去掉这个,或者它最开始为什么会在这里……还有很多东西需要学习。

撰写回答