Изменение размера безрамочного окна

Столкнулся с проблемой: у безрамочного виджета (с флагом FramelessWindowHint) фиксированный размер.

Как сделать изменяемым?


import sys
from PySide6.QtWidgets import QLabel, QApplication
from PySide6 import QtCore


class label(QLabel):
    def __init__(self):
        super(label, self).__init__()
        self.old_pos = None
        self.setGeometry(200, 200, 300, 400)
        self.setWindowFlag(QtCore.Qt.WindowType.FramelessWindowHint)
        self.setText("Window")
        self.setAlignment(QtCore.Qt.AlignHCenter)

    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.old_pos = event.pos()

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.old_pos = None

    def mouseMoveEvent(self, event):
        if not self.old_pos:
            return
        self.delta = event.pos() - self.old_pos
        self.move(self.pos() + self.delta)


if __name__ == "__main__":
    app = QApplication([])
    lbl = label()
    lbl.show()
    sys.exit(app.exec())

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

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

Самый простой вариант.

Класс QSizeGrip предоставляет дескриптор изменения размера окон верхнего уровня.

Для главного окна лучше использовать класс QWidget или QMainWindow, а не QLabel.

import sys
'''
from PySide6.QtWidgets import QLabel, QApplication
from PySide6 import QtCore
'''
from PyQt5.Qt import *
from PyQt5 import QtWidgets, QtCore, QtGui


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowFlag(QtCore.Qt.WindowType.FramelessWindowHint)
        self.setStyleSheet('background: #55f;')
        self.setStyleSheet("border: 1px solid #fff; background-color: #55f;")  
        
        self.old_pos = None
        
        self.label = QLabel('Hellow Label', alignment=QtCore.Qt.AlignCenter)
        self.label.setStyleSheet('background:#99f; font-size: 24px;')
        
        self.sizeGrip1 = QSizeGrip(self)
        self.sizeGrip2 = QSizeGrip(self)
        self.sizeGrip2.setStyleSheet("""
            QSizeGrip {
                width: 10px; height: 10px; margin: 3px 
            } 
            QSizeGrip:hover {background-color: rgb(222, 42, 94) }
        """)
        self.sizeGrip2.setToolTip("<b style='color:#fff;'>Resize Window</b>")
        
        layout = QGridLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.sizeGrip1, 0, 0)
        layout.addWidget(self.label, 1, 1)
        layout.addWidget(self.sizeGrip2, 2, 2)
        layout.setRowStretch(1, 1)
        layout.setColumnStretch(1, 1)
        
    def mousePressEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.old_pos = event.pos()

    def mouseReleaseEvent(self, event):
        if event.button() == QtCore.Qt.LeftButton:
            self.old_pos = None

    def mouseMoveEvent(self, event):
        if not self.old_pos:
            return
        self.delta = event.pos() - self.old_pos
        self.move(self.pos() + self.delta)        
        

if __name__ == "__main__":
    app = QApplication([])
    w = MainWindow()
    w.setWindowTitle('Window')
    w.resize(300, 400)
    w.show()
    sys.exit(app.exec())

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

Не пугайтесь моей раскраски, я сделал это специально, чтобы вам было все видно. Все можно раскрасить как вам будет угодно.

→ Ссылка