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_())
什麼情況是,該按鈕仍是半透明,並且背景被設置爲系統定義的顏色(而不是黑色,現在是白色)。我不確定setWindowOpacity是否適用於非窗口小部件。 – Enuy
編輯我的答案。我有時候會這樣做,它會隨着你的需要而工作。 – Aaron
好吧,我會嘗試將這個QT僞代碼轉換爲PyQT,看看它是如何工作的。 – Enuy