Функция максимизации окна не работает как ожидалось
Расширение окна на весь экран срабатывает, но вместо ожидаемого, окно просто перемещается в позицию экрана 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_())
Ответы (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_())


