2015-11-29 148 views
6

我想創建一個帶有半透明背景的全屏窗口,但完全可見的子窗口小部件(一種疊加效果)。PyQt5:創建帶有非透明子區域的半透明窗口

這是我到目前爲止有:

import sys 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

app = QApplication(sys.argv) 

# Create the main window 
window = QMainWindow() 

window.setWindowOpacity(0.3) 
window.setAttribute(Qt.WA_NoSystemBackground, True) 
window.setWindowFlags(Qt.FramelessWindowHint) 

# Create the button 
pushButton = QPushButton(window) 
pushButton.setGeometry(QRect(240, 190, 90, 31)) 
pushButton.setText("Finished") 
pushButton.clicked.connect(app.quit) 

# Center the button 
qr = pushButton.frameGeometry() 
cp = QDesktopWidget().availableGeometry().center() 
qr.moveCenter(cp) 
pushButton.move(qr.topLeft()) 

# Run the application 
window.showFullScreen() 
sys.exit(app.exec_()) 

這將創建一個半透明的效果,但即使按鈕是半透明的。

我也試圖與該呼叫

window.setAttribute(Qt.WA_TranslucentBackground, True) 

但無濟於事來替代

window.setWindowOpacity(0.3) 

,在這種情況下,背景是完全透明(按住該按鈕是正確的完全可見)。

解決方案:(實施感謝Aaron的建議)

的竅門是在執行主窗口中的自定義的paintEvent。

import sys 

from PyQt5.QtCore import * 
from PyQt5.QtGui import * 
from PyQt5.QtWidgets import * 

class CustomWindow(QMainWindow): 
    def paintEvent(self, event=None): 
     painter = QPainter(self) 

     painter.setOpacity(0.7) 
     painter.setBrush(Qt.white) 
     painter.setPen(QPen(Qt.white)) 
     painter.drawRect(self.rect()) 


app = QApplication(sys.argv) 

# Create the main window 
window = CustomWindow() 

window.setWindowFlags(Qt.FramelessWindowHint) 
window.setAttribute(Qt.WA_NoSystemBackground, True) 
window.setAttribute(Qt.WA_TranslucentBackground, True) 

# Create the button 
pushButton = QPushButton(window) 
pushButton.setGeometry(QRect(240, 190, 90, 31)) 
pushButton.setText("Finished") 
pushButton.clicked.connect(app.quit) 

# Center the button 
qr = pushButton.frameGeometry() 
cp = QDesktopWidget().availableGeometry().center() 
qr.moveCenter(cp) 
pushButton.move(qr.topLeft()) 

# Run the application 
window.showFullScreen() 
sys.exit(app.exec_()) 

回答

4

好了,雖然看起來不是可用標誌工作,你仍然可以使用Qt.WA_TranslucentBackground,因爲它可以借鑑一下透明度semitranparent矩形。

從QMainWindow派生您的主窗口並改爲使用該類。

應用self.setAttribute(Qt.WA_TranslucentBackground, True)的那類

實現你的主窗口類的像這樣的paintEvent(類似,可能包含錯誤,但原則應該工作):

QPixmap canvas(rect()) 

canvas.fill(Qt.transparent) # fill transparent (makes alpha channel available) 

QPainter p(canvas)   # draw on the canvas 
p.setOpacity(0.3) 
p.setBrush(QBrush(Qt.white)) # use the color you like 
p.setPen(QPen(Qt.transparen)) 

p.drawRect(rect()) # draws the canvas with desired opacity 

p.start(self)  # now draw on the window itself 
p.drawPixmap(rect(), canvas) 
+0

什麼情況是,該按鈕仍是半透明,並且背景被設置爲系統定義的顏色(而不是黑色,現在是白色)。我不確定setWindowOpacity是否適用於非窗口小部件。 – Enuy

+0

編輯我的答案。我有時候會這樣做,它會隨着你的需要而工作。 – Aaron

+0

好吧,我會嘗試將這個QT僞代碼轉換爲PyQT,看看它是如何工作的。 – Enuy