Как с помощью мыши, изменить размер прозрачного окна?

Перетаскивание окошка я реализовал.

А как размер изменить не могу понять.

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget, QMessageBox
from PyQt5.QtWidgets import QTextBrowser, QGridLayout, QLabel, QCheckBox, qApp
from PyQt5.QtCore import QPoint, QObject, QThread, pyqtSignal, QRect, QSize, QTimer
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QPalette, QBrush, QImage, QCursor
from PIL import Image, ImageDraw


# Отловить ошибки в слотах PyQt5
def log_uncaught_exceptions(ex_cls, ex, tb):
    text = '{}: {}:\n'.format(ex_cls.__name__, ex)
    import traceback
    text += ''.join(traceback.format_tb(tb))

    print(text)
    QMessageBox.critical(None, 'Упс! Ошибочка...', text)
    quit()
sys.excepthook = log_uncaught_exceptions


class DisplayWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.interface()
    def interface(self):
        self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint)
        self.setWindowFlag(Qt.WindowStaysOnTopHint)
        self.setGeometry(200, 200, 300, 535)

        image = Image.new(mode='RGBA', size=(300, 535))

        draw = ImageDraw.Draw(image)
        draw.rectangle((0, 0, 300, 535),outline='blue', width=5)
        del draw

        pixmap = QPixmap(image.toqpixmap())
        palette = self.palette()
        palette.setBrush(QPalette.Normal, QPalette.Window, QBrush(pixmap))
        palette.setBrush(QPalette.Inactive, QPalette.Window, QBrush(pixmap))

        self.setPalette(palette)
        self.setMask(pixmap.mask())

    def drag_window(self, event):
        delta = QPoint(event.globalPos() - self.old_position)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.old_position = event.globalPos()
    def mousePressEvent(self, event):
        """Выбрать окно при помощи мыши"""
        self.old_position = event.globalPos()
    def mouseMoveEvent(self, event):
        self.drag_window(event)

def main():
    application = QApplication(sys.argv)
    display_window = DisplayWindow()
    display_window.show()
    sys.exit(application.exec_())

if __name__ == '__main__':
    main()

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

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

Обратите внимание класс DisplayWindow наследуется от QDialog

sizeGripEnabled : bool

Это свойство указывает, включена ли grip размера.

QSizeGrip помещается в нижний правый угол диалогового окна, когда это свойство включено. По умолчанию ручка размера отключена.

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QDesktopWidget, QMessageBox, QDialog
from PyQt5.QtWidgets import QTextBrowser, QGridLayout, QLabel, QCheckBox, qApp
from PyQt5.QtCore import QPoint, QObject, QThread, pyqtSignal, QRect, QSize, QTimer
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QPalette, QBrush, QImage, QCursor
from PIL import Image, ImageDraw


# Отловить ошибки в слотах PyQt5
def log_uncaught_exceptions(ex_cls, ex, tb):
    text = '{}: {}:\n'.format(ex_cls.__name__, ex)
    import traceback
    text += ''.join(traceback.format_tb(tb))

    print(text)
    QMessageBox.critical(None, 'Упс! Ошибочка...', text)
    quit()
sys.excepthook = log_uncaught_exceptions


class DisplayWindow(QDialog):                                    # - QWidget, +++ !!! QDialog
    def __init__(self):
        super().__init__()
        
        self.resize(300, 535)                                                # +
        self.setMinimumSize(QSize(100, 100))
        self.w = 300                                                         # +
        self.h = 535                                                         # +

        self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint)              # +
        self.setWindowFlag(Qt.WindowStaysOnTopHint)                          # +
        
        
        self.interface()
        
        self.setSizeGripEnabled(True)                                        # +++ !!!

        
    def interface(self):
#        self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint)
#        self.setWindowFlag(Qt.WindowStaysOnTopHint)
#        self.setGeometry(200, 200, 300, 535)
#        self.resize(300, 535)

#        image = Image.new(mode='RGBA', size=(300, 535))
        image = Image.new(mode='RGBA', size=(self.w, self.h))                # +++ self.w, self.h
        draw = ImageDraw.Draw(image) 
#        draw.rectangle((0, 0, 300, 535),outline='blue', width=5)
        draw.rectangle((0, 0, self.w, self.h),outline='blue', width=5)       # +++ self.w, self.h
        del draw

        pixmap = QPixmap(image.toqpixmap())
        palette = self.palette()
        palette.setBrush(QPalette.Normal, QPalette.Window, QBrush(pixmap))
        palette.setBrush(QPalette.Inactive, QPalette.Window, QBrush(pixmap))

        self.setPalette(palette)
        self.setMask(pixmap.mask())

    def drag_window(self, event):
        delta = QPoint(event.globalPos() - self.old_position)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.old_position = event.globalPos()
        
    def mousePressEvent(self, event):
        """Выбрать окно при помощи мыши"""
        self.old_position = event.globalPos()
        
    def mouseMoveEvent(self, event):
        self.drag_window(event)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def resizeEvent(self, event):
        self.w = self.width()
        self.h = self.height()
        self.interface()
        super().resizeEvent(event)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        
        

def main():
    application = QApplication(sys.argv)
    display_window = DisplayWindow()
    display_window.show()
    sys.exit(application.exec_())

if __name__ == '__main__':
    main()

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

→ Ссылка