Как реализовать закругленные углы для окна, вызывающего SetWindowCompositionAttribute

Вызов SetWindowCompositionAttributeдействительно может добавить в окно акриловый эффект Win10, но у меня есть проблема, которую я все еще не могу решить, а именно, как реализовать закругленное окно при добавлении акрилового эффекта. Как показано на рисунке ниже, даже если я используюwin32guiSetWindowRgn(int(self.winId()),win32gui.CreateRoundRectRgn(0, 0, 500, 500, 500, 500), True)в pyqt акриловую панель нельзя обрезать. Могу я спросить, у вас есть хорошие идеи?

акриловое окно

2 ответа

В SetWindowCompositionAttributeAPI не является публичным. Чтобы применить один или несколько высококачественных эффектов к изображению или набору изображений, вы можете использовать Direct2D.

Вот несколько полезных ссылок для начала:

Как загрузить изображение в эффекты Direct2D с помощью FilePicker

Эффект направленного размытия

Пользовательские эффекты

И если вы все еще хотите использовать SetWindowCompositionAttributeAPI, я бы посоветовал вам поднять свой голос на 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

Другие вопросы по тегам