Функция максимизации окна не работает как ожидалось

Расширение окна на весь экран срабатывает, но вместо ожидаемого, окно просто перемещается в позицию экрана 0, 0, а размеры окна остаются прежними.

При том, в месте где должен быть стандартный титульный бар пусто, а кастомные кнопки навигации исчезают. Кнопка сворачивания и закрытия работают идеально.

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui
from PyQt5.QtCore import *
from PyQt5.QtGui import QColor, QFont, QFontDatabase, QIcon, QImage, QPixmap
from PyQt5.QtWidgets import *


class Window(QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

        self.clicks = 0
        self.setStyleSheet("background-color: rgb(35,43,50);")
        self.setMinimumSize(800, 500)
        self.resize(1200, 700)
        path = QtGui.QPainterPath()
        path.addRoundedRect(QtCore.QRectF(self.rect()), 10.0, 10.0)
        mask = QtGui.QRegion(path.toFillPolygon().toPolygon())
        self.setMask(mask)

        self.top_bar = QFrame()
        self.top_bar.setStyleSheet("background-color: rgb(35,43,50);")
        self.top_bar.setMaximumHeight(40)
        self.top_bar.setFrameShadow(QFrame.Raised)

        self.content = QFrame()
        self.content.setStyleSheet("background-color: rgb(35,43,50);")
        self.content.setFrameShadow(QFrame.Raised)
# title_bar
        self.title_bar = QFrame()
        self.title_bar.setStyleSheet("background-color: transparent")
        self.title_bar.setMinimumWidth(120)

# min_button
        self.min_button = QPushButton()
        self.min_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20,120,60);
                border: 0px solid 
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.min_button.setIcon(
            QIcon(QPixmap('icons/Apagar/cil-fullscreen-exit.png')))
        self.min_button.setMinimumHeight(40)
        self.min_button.setMaximumWidth(40)
        self.min_button.clicked.connect(self.turn_window)

# max_button
        self.max_button = QPushButton()
        self.max_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20,120,60);
                border: 0px solid 
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.max_button.setIcon(
            QIcon(QPixmap('icons/Apagar/cil-fullscreen.png')))
        self.max_button.setMinimumHeight(40)
        self.max_button.setMaximumWidth(40)
        self.max_button.clicked.connect(self.expand_window)

# close_button
        self.close_button = QPushButton()
        self.close_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20,120,60);
                border: 0px solid 
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.close_button.setIcon(
            QIcon(QPixmap('icons/Apagar/cil-power-standby.png')))
        self.close_button.setMinimumHeight(40)
        self.close_button.setMaximumWidth(40)
        self.close_button.clicked.connect(self.close_window)

        self.layout_navigation = QGridLayout(self.top_bar)
        self.layout_navigation.addWidget(self.title_bar, 0, 0)
        self.layout_navigation.addWidget(self.min_button, 0, 1)
        self.layout_navigation.addWidget(self.max_button, 0, 2)
        self.layout_navigation.addWidget(self.close_button, 0, 3)
        self.layout_navigation.setContentsMargins(0, 0, 0, 0)

        self.vbox_2 = QVBoxLayout(self)
        self.vbox_2.addWidget(self.top_bar)
        self.vbox_2.addWidget(self.content)
        self.vbox_2.setContentsMargins(0, 0, 0, 0)
        self.vbox_2.setSpacing(0)

    def turn_window(self):
        self.showMinimized()

    def expand_window(self):
        self.showMaximized()

    def close_window(self):
        sys.exit(0)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

Вот как это выглядит Screen


Ответы (1 шт):

Автор решения: S. Nick

setMask все ломает.

Вот что вам надо:

self.setWindowFlags(Qt.FramelessWindowHint) 
self.setAttribute(Qt.WA_TranslucentBackground)  

Почитаете:

Я отметил строки, в которые внес изменения. Установите ваши цвета и изображения.

Обратите внимание на метод expand_window и другие методы, которые я добавил.

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *


class Window(QWidget):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)

# ???        self.clicks = 0
        self.setStyleSheet("background-color: rgb(235, 43, 50);")
        self.setMinimumSize(800, 500)

        self.setWindowFlags(Qt.FramelessWindowHint)                  # +++ !!!
        self.setAttribute(Qt.WA_TranslucentBackground)               # +++ !!!
        self.offset = None                                           # +++
        
        ''' вот это все ломает
        path = QtGui.QPainterPath()
        path.addRoundedRect(QtCore.QRectF(self.rect()), 10.0, 10.0)
        mask = QtGui.QRegion(path.toFillPolygon().toPolygon())
        self.setMask(mask)
        '''

        self.top_bar = QFrame()
        self.top_bar.setObjectName('top_bar')                        # +++
        self.top_bar.setStyleSheet("""
            #top_bar {                                     /* <---- */
                background-color: rgb(35,43,150);
                border-top-left-radius:  1em 1em;          /* <---- */
                border-top-right-radius:  1em 1em;         /* <---- */
            }
        """)
        self.top_bar.setMaximumHeight(40)
        self.top_bar.setFrameShadow(QFrame.Raised)

        self.content = QFrame()
        self.content.setStyleSheet("""
            background-color: rgb(135, 43, 50);
            border-bottom-right-radius: 1em 1em;           /* <---- */
            border-bottom-left-radius:  1em 1em;           /* <---- */
        """)
        self.content.setFrameShadow(QFrame.Raised)
        
        # title_bar 
        self.title_bar = QFrame() 
        self.title_bar.setStyleSheet("""
            background-color: #FFA41B;
            border-top-left-radius:  1em 1em;               /* <---- */
        """)
        self.title_bar.setMinimumWidth(120)

        # min_button
        self.min_button = QPushButton()
        self.min_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20,120,60);
                border: 0px solid 
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.min_button.setIcon(
            QIcon(QPixmap('minus.svg')))                               # !
        self.min_button.setMinimumHeight(40)
        self.min_button.setMaximumWidth(40)
        self.min_button.clicked.connect(self.turn_window)

        # max_button
        self.max_button = QPushButton()
        self.max_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20,120,60);
                border: 0px solid 
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.max_button.setIcon(
            QIcon(QPixmap('maximize.svg')))                            # !
        self.max_button.setMinimumHeight(40)
        self.max_button.setMaximumWidth(40)
        self.max_button.clicked.connect(self.expand_window)

        # close_button
        self.close_button = QPushButton()
        self.close_button.setStyleSheet("""
            QPushButton:hover { 
                background-color: rgb(20, 120, 60);
                border: 0px solid;
                border-top-right-radius:  1em 1em;              /* <---- */
            }
            QPushButton:!hover { 
                background-color: transparent; 
                border: 0px solid; 
                font: 11pt; 
                color: rgb(180,180,180) 
            }
        """)
        self.close_button.setIcon(
            QIcon(QPixmap('close.svg')))                               # !
        self.close_button.setMinimumHeight(40)
        self.close_button.setMaximumWidth(40)
        self.close_button.clicked.connect(self.close_window)

        self.layout_navigation = QGridLayout(self.top_bar)
        self.layout_navigation.addWidget(self.title_bar, 0, 0)
        self.layout_navigation.addWidget(self.min_button, 0, 1)
        self.layout_navigation.addWidget(self.max_button, 0, 2)
        self.layout_navigation.addWidget(self.close_button, 0, 3)
        self.layout_navigation.setContentsMargins(0, 0, 0, 0)

        self.vbox_2 = QVBoxLayout(self)
        self.vbox_2.addWidget(self.top_bar)
        self.vbox_2.addWidget(self.content)
        self.vbox_2.setContentsMargins(0, 0, 0, 0)
        self.vbox_2.setSpacing(0)

    def turn_window(self):
        self.showMinimized()

    def expand_window(self):
#        self.showMaximized()
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
        if self.isMaximized():
            self.max_button.setIcon(QIcon("maximize.svg"))             # !
            self.showNormal()
        else:
            self.max_button.setIcon(QIcon("minimize.svg"))             # !
            self.showMaximized()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def close_window(self):
#        sys.exit(0)
        self.close()

# +++ vvv теперь вы можете перемещать окно
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.offset = event.pos()
        else:
            super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.offset is not None and event.buttons() == QtCore.Qt.LeftButton:
            self.move(self.pos() + event.pos() - self.offset)
        else:
            super().mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        self.offset = None
        super().mouseReleaseEvent(event)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка