2012-11-13 68 views
2

我想通過截取窗口後面的內容來創建一個僞透明窗口,如果它不在那裏使用PyQt。以下代碼需要屏幕截圖:PyQT的僞透明度

#!/usr/bin/python3 

from PyQt4.QtGui import * 

app = QApplication([]) 
widget = QWidget() 
widget.setLayout(QVBoxLayout()) 
label = QLabel() 
widget.layout().addWidget(label) 

def shoot(): 
    geometry = widget.geometry() 
    widget.hide() 
    label.setPixmap(QPixmap.grabWindow(QApplication.desktop().winId(), x = geometry.x(), y = geometry.y(), height = geometry.height(), width = geometry.width()) 
    widget.show() 

widget.layout().addWidget(QPushButton('Screenshot', clicked = shoot)) 
widget.show() 
app.exec_() 

雖然存在widget.hide(),但窗口本身顯示在屏幕截圖上。我怎樣才能避免這種情況?

+3

你有沒有嘗試在'widget.hide()'和設置標籤的Pixmap之間等待('time.sleep()')一段時間?當你截圖的時候,可能這個小部件還沒有被隱藏。另外,你是否嘗試過使用'widget.setAttribute(Qt.WA_TranslucentBackground,True)'實際透明度? – Junuxx

+0

謝謝,如果我在widget.hide()之後添加0.3秒的睡眠,它實際上是有效的。但是我怎麼知道要等多久?有沒有辦法等到隱藏事件結束? –

回答

0

我認爲,睡眠時間不應該是未知的,app.processEvents()也應該有效。這迫使Qt應用程序在繼續之前完成正在進行的工作 - 比如隱藏小部件。 This是一個相關問題,其中一個答案中討論了這個問題。

+0

似乎像processEvents()不夠長。我也嘗試while self.isHidden()==假:睡眠(0.1),但這也不會等待足夠長的時間。窗口閃爍了一下,但屏幕截圖沒有顯示它背後的桌面。 –