Как реализовать закругленные углы для окна, вызывающего SetWindowCompositionAttribute
Вызов SetWindowCompositionAttribute
действительно может добавить в окно акриловый эффект Win10, но у меня есть проблема, которую я все еще не могу решить, а именно, как реализовать закругленное окно при добавлении акрилового эффекта. Как показано на рисунке ниже, даже если я используюwin32guiSetWindowRgn(int(self.winId()),win32gui.CreateRoundRectRgn(0, 0, 500, 500, 500, 500), True)
в pyqt акриловую панель нельзя обрезать. Могу я спросить, у вас есть хорошие идеи?
2 ответа
В SetWindowCompositionAttribute
API не является публичным. Чтобы применить один или несколько высококачественных эффектов к изображению или набору изображений, вы можете использовать Direct2D.
Вот несколько полезных ссылок для начала:
Как загрузить изображение в эффекты Direct2D с помощью FilePicker
И если вы все еще хотите использовать SetWindowCompositionAttribute
API, я бы посоветовал вам поднять свой голос на Feedback Hub.
Вы можете использовать border-radius для обходного пути (UpdateLayeredWindow эквивалентно WA_TranslucentBackground, SetWindowRgn не влияет на размытие SetWindowCompositionAttribute)
Полный код:
Stylesheet = """
#Custom_Widget {
border-radius: 20px;
opacity: 100;
border: 8px solid #cdced4;
}
#closeButton {
min-width: 36px;
min-height: 36px;
border-radius: 10px;
}
#closeButton:hover {
color: #FFFFFF;
background: red;
}
"""
import sys
from PySide2.QtWidgets import *
from PySide2.QtCore import *
from BlurWindow.blurWindow import GlobalBlur
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setStyleSheet(Stylesheet)
self.setWindowFlag(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground, True)
self.resize(488, 388)
GlobalBlur(self.winId(),Acrylic=True,hexColor='#FFFFFF20')
self.Borders() #the real MainWindow
def Borders(self):
window = QMainWindow(self)
window.setAttribute(Qt.WA_TranslucentBackground)
window.setWindowFlag(Qt.FramelessWindowHint)
window.resize(500, 400)
self.widget = QWidget(window)
window.setCentralWidget(self.widget)
self.widget.setObjectName('Custom_Widget')
self.layout = QHBoxLayout(self.widget)
self.layout.addWidget(QPushButton(
'X', self,clicked=exit, objectName='closeButton'))
self.layout.addWidget(QLabel("<h2 style='color:blue;'>Blurry</h2>"))
window.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
mw = MainWindow()
mw.show()
sys.exit(app.exec_())
Альфа-пример UpdateLayeredWindow: https://github.com/wxWidgets/Phoenix/issues/1544