2011-10-05 103 views
3

(我使用PySide,但我認爲對於任何語言綁定,答案都是相同/相似的)。Qt Widget具有透明背景

我試圖把整形的時鐘例如,位於here,並導致時鐘(圈子)的面是透明的,讓所有我看到的是時鐘指針和刻度分鐘。就像這個例子運行時,它看起來像this。我使用的是Windows 7

到目前爲止,我已經試過以下(在構造函數):

  • self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
    • 出現時鐘(已存在於任務欄),但我不能看到它的任何地方
  • self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
    • 出現時鐘,但具有純黑色背景。
  • self.setWindowOpacity(0.5)
    • 時鐘出現,但整個時鐘是透明的。我希望背景(臉部)是透明的,但我希望鐘錶可以看到。
+0

爲了記錄,我認爲這個小部件有一個透明的背景,但它明顯坐在別的東西上。這是一個正確的說法嗎? – gdw2

回答

4

Got it!

這是從原來的示例代碼(構造函數):

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

下面是修改(按我的問題的工作)的版本:

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

卸下self.windowFlags()是我的一部分失蹤。 (我不完全確定爲什麼我需要刪除它或爲什麼它在那裏開始......還有很多要學習)。

+0

嗯。我以前沒有聽說過WA_TranslucentBackground。我嘗試將它添加到時鐘樣本中,並在KDE下運行它,並且我得到的只是小部件的純黑色背景。你在代碼中還有什麼改變,你得到了什麼結果? – HostileFork

+0

您是否注意到'self.setWindowFlags'行中的上述變化? – gdw2

+0

所以我們應該找出'self.windowFlags()'默認設置哪些標誌。 – Trilarion

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) 

所以應該也工作?

+0

我稍微澄清了我的問題。上面的代碼確實會讓時鐘以外的所有東西都變得透明,但我試圖讓時鐘本身透明(除時鐘和分鐘刻度之外的所有東西)。 – gdw2

2

如果我沒記錯的話,你應該設置它的樣式也:

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

希望有所幫助。

+0

這取決於。由於屬性'QtCore.Qt.WA_TranslucentBackground',該部件本身具有透明背景,並且不需要樣式表本身,但是包含在小部件中但具有默認'autoFillBackground()== True'的子部件應該具有它未設置或者應該設置'QtCore.Qt.WA_TranslucentBackground',或者您確實應該設置透明背景顏色,然後繼承樣式表。 – Trilarion