Python 具有透明背景的Qt小部件

Python 具有透明背景的Qt小部件,python,qt,transparency,pyside,Python,Qt,Transparency,Pyside,(我正在使用PySide,但我认为对于任何语言绑定,答案都是相同/相似的) 我试着以形状时钟为例,定位,并使时钟(圆)的表面透明,这样我所看到的就是时钟指针和滴答声。就像这样,当示例运行时,它看起来像。我正在使用Windows7 到目前为止,我已经尝试了以下方法(在构造函数中): self.setAttribute(QtCore.Qt.WA_半透明背景) 时钟出现(任务栏中有显示),但我在任何地方都看不到它 self.setAttribute(QtCore.Qt.WA\u NoSystem

(我正在使用PySide,但我认为对于任何语言绑定,答案都是相同/相似的)

我试着以形状时钟为例,定位,并使时钟(圆)的表面透明,这样我所看到的就是时钟指针和滴答声。就像这样,当示例运行时,它看起来像。我正在使用Windows7

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

  • self.setAttribute(QtCore.Qt.WA_半透明背景)
    • 时钟出现(任务栏中有显示),但我在任何地方都看不到它
  • self.setAttribute(QtCore.Qt.WA\u NoSystemBackground)
    • 时钟出现,但有坚实的黑色背景
  • self.setWindowOpacity(0.5)
    • 时钟出现,但整个时钟是透明的。我希望背景(面)是透明的,但我希望时钟指针是可见的

    • 在时钟示例中,它们是:

      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)
      
      所以它也应该起作用吗?

      明白了

      这来自原始示例代码(构造函数):

      以下是修改后的版本(并根据我的问题进行操作):


      删除
      self.windowFlags()
      是我丢失的部分。(我不太清楚为什么我需要删除它,或者为什么它一开始就在那里……还有很多东西需要学习)。

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

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

      希望这能有所帮助。

      我认为这个小部件确实有一个透明的背景,但它显然是放在其他东西上,而不是。这是正确的说法吗?我稍微澄清了我的问题。你上面的代码确实使时钟表面之外的所有东西都是透明的,但我正试图使时钟表面本身透明(除了时钟指针和分钟刻度线之外的所有东西)。我以前没听说过WA_半透明背景。我试着将它添加到时钟样本中,并在KDE下运行,我得到的只是小部件的一个黑色背景。您在代码中还更改了哪些内容以及得到了什么结果?您是否注意到上面的
      self.setWindowFlags
      行中的更改?因此,您应该了解哪些标志是默认情况下由
      self.windowFlags()
      设置的。这取决于具体情况。由于属性
      QtCore.Qt.WA_transparcentbackground
      的缘故,小部件本身有一个透明的背景,并且不需要样式表本身,而是小部件中包含的具有
      autoFillBackground()的子部件==True
      默认情况下应该将其取消设置,或者应该将其设置为
      QtCore.Qt.WA_transparcentbackground
      ,或者像您所说的那样,应该由样式表设置透明背景色,然后将其继承。
          ...
          self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
          self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
          ...
      
      self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
      self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
      self.setStyleSheet("background:transparent;")