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.setWindowOpacity(0.3)

с этим звонком

window.setAttribute(Qt.WA_TranslucentBackground, True)

но безрезультатно, в этом случае фон был полностью прозрачным (в то время как кнопка была правильно полностью видна).

Решение: (реализовано благодаря предложению Аарона) :

Хитрость заключается в реализации пользовательского 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_())
7 голосов | спросил Enuy 29 72015vEurope/Moscow11bEurope/MoscowSun, 29 Nov 2015 14:17:30 +0300 2015, 14:17:30

1 ответ


0

Хорошо, хотя кажется, что он не работает с доступными флагами, вы все равно можете использовать Qt.WA_TranslucentBackground, поскольку можно нарисовать полупрозрачный прямоугольник на эту прозрачность.

Получите ваше главное окно из QMainWindow и используйте вместо этого этот класс.

Применить self.setAttribute(Qt.WA_TranslucentBackground, True) к этому классу

Реализуйте paintEvent вашего класса mainwindow следующим образом (похоже, он может содержать ошибки, но принцип должен работать):

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)
ответил Aaron 1 TueEurope/Moscow2015-12-01T16:04:12+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 16:04:12 +0300 2015, 16:04:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132