Что такое маска? (PyQt5)

Что такое маска изображения в PyQt5 и для чего она применяется?


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

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

void QWidget::setMask(const QBitmap &bitmap)

Делает видимыми только те пиксели виджета, для которых растровое изображение имеет соответствующий 1 бит.
Если область включает пиксели за пределами rect() виджета, элементы управления оконной системой в этой области могут быть или не быть видимыми, в зависимости от платформы.

Обратите внимание, что этот эффект может быть медленным, если область особенно сложна.

Виджет маскируется с помощью содержащегося в нем изображения, создавая впечатление, что изображение рисуется прямо на экране.

Маскированные виджеты получают события мыши только в своих видимых частях.

Как можно использовать изображение с альфа-каналом для создания маски для виджета:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui

 
class Demo(QtWidgets.QWidget):
    def __init__(self):
        super().__init__() 

        pixmap = QtGui.QPixmap("heart.png").scaled(
            150, 150, QtCore.Qt.KeepAspectRatio, QtCore.Qt.FastTransformation)

        pal = self.palette()
        pal.setBrush(QtGui.QPalette.Normal, QtGui.QPalette.Window, QtGui.QBrush(pixmap))
        pal.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, QtGui.QBrush(pixmap))
        self.setPalette(pal)
        
        #print(f'{pixmap.mask()}') 
        self.setMask(pixmap.mask())
        
        self.offset = None
        self.installEventFilter(self)

    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseButtonPress:
            self.offset = event.pos()
        elif event.type() == QtCore.QEvent.MouseMove and self.offset is not None:
            self.move(self.pos() - self.offset + event.pos())
            return True
        elif event.type() == QtCore.QEvent.MouseButtonRelease:
            self.offset = None
        return super().eventFilter(source, event)

        
if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)
    w = Demo()
    w.resize(150, 150)
    w.show()
    sys.exit(app.exec_())

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

heart.png

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

→ Ссылка
Автор решения: S. Nick

void QWidget::setMask(const QRegion &region)

Делает видимыми только те части виджета, которые перекрывают область. Если область включает пиксели за пределами rect() виджета, элементы управления оконной системой в этой области могут быть или не быть видимыми, в зависимости от платформы.

Обратите внимание, что этот эффект может быть медленным, если область особенно сложна.

Настройка окна - Круглый интерфейс:

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.resize(400, 400)
        self.centralwidget = QtWidgets.QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("""
            #centralwidget {
                border-image: url(head2.jpg);
            }
        """)
        self.setCentralWidget(self.centralwidget)

        # попробуйте убрать три строки ниже
        rect = QtCore.QRect(0, 0, self.width(), self.height())

        my_region = QtGui.QRegion(rect, QtGui.QRegion.Ellipse)
        
        self.setMask(my_region)
        
        
if __name__ == '__main__': 
    import sys
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())

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

head2.jpg

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

→ Ссылка