PyQt5图形和特效之不规则窗口的显示(七)

版权声明:如有使用转载,请附加出处 https://blog.csdn.net/jia666666/article/details/81874586

QWidget类中比较重要的绘图函数如表所示

函数 描述
setMask(self,QBitmap)setMask(self,QRegion) setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的,它的参数可以为QBitmap或QRegion对象,此处调用QPixmap的mask()函数获得图片自身的遮罩,是一个QBitmap对象,在实例中使用的是PNG格式的图片,它的透明部分就是一个遮罩
paintEvent(self,QPaintEvent) 通过重载paintEvent()函数绘制窗口背景

实例:不规则窗口的显示(1)

实现不规则窗口的最简单方式就是图片素材不仅当遮罩层,还当背景图片,通过重载paintEvent()函数绘制窗口背景

import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPixmap,QPainter,QBitmap

class MyForm(QWidget):
    def __init__(self,parent=None):
        super(MyForm, self).__init__(parent)
        #设置标题与初始窗口大小
        self.setWindowTitle('不规则窗口的实现例子')
        self.resize(560,390)

    def paintEvent(self, QPaintEvent):
        painter=QPainter(self)
        #在指定位置绘制图片
        painter.drawPixmap(0,0,280,390,QPixmap(r'./images/dog.jpg'))
        painter.drawPixmap(280,0,280,390,QBitmap(r'./images/dog.jpg'))
if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=MyForm()
    form.show()
    sys.exit(app.exec_())

运行效果如下

这里写图片描述

实例:不规则窗口的显示(2)

使用两张图片,一张用来做遮罩来控制窗口的大小,然后在利用paintEvent()函数重绘另一张为窗口的背景图。

import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPixmap,QPainter,QBitmap

class MyForm(QWidget):
    def __init__(self,parent=None):
        super(MyForm, self).__init__(parent)
        #设置标题与初始窗口大小
        self.setWindowTitle('不规则窗口的实现例子')

        self.pix=QBitmap('./images/mask.png')
        self.resize(self.pix.size())
        self.setMask(self.pix)

    def paintEvent(self, QPaintEvent):
        painter=QPainter(self)
        #在指定位置绘制图片
        painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap(r'./images/screen1.jpg'))

if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=MyForm()
    form.show()
    sys.exit(app.exec_())

运行效果如下
这里写图片描述

实例:可以拖动的不规则窗口

第二个窗口的实例是不可以拖动的,这里实现可以拖动的功能



import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPixmap, QPainter, QCursor, QBitmap
from PyQt5.QtCore import Qt


class ShapeWidget(QWidget):
    def __init__(self, parent=None):
        super(ShapeWidget, self).__init__(parent)
        self.setWindowTitle("不规则的,可以拖动的窗体实现例子")
        self.mypix()

    # 显示不规则 pix
    def mypix(self):
        #获得图片自身的遮罩
        self.pix = QBitmap("./images/mask.png")
        #将获得的图片的大小作为窗口的大小
        self.resize(self.pix.size())
        #增加一个遮罩
        self.setMask(self.pix)
        #print(self.pix.size())
        self.dragPosition = None

    # 重定义鼠标按下响应函数mousePressEvent(QMouseEvent)
    # 鼠标移动响应函数mouseMoveEvent(QMouseEvent),使不规则窗体能响应鼠标事件,随意拖动。
    def mousePressEvent(self, event):
        #鼠标左键按下
        if event.button() == Qt.LeftButton:
            self.m_drag = True
            self.m_DragPosition = event.globalPos() - self.pos()
            event.accept()
            self.setCursor(QCursor(Qt.OpenHandCursor))
        if event.button() == Qt.RightButton:
            self.close()

    def mouseMoveEvent(self, QMouseEvent):
        if Qt.LeftButton and self.m_drag:
            # 当左键移动窗体修改偏移值
            self.move(QMouseEvent.globalPos() - self.m_DragPosition)
            QMouseEvent.accept()

    def mouseReleaseEvent(self, QMouseEvent):
        self.m_drag = False
        self.setCursor(QCursor(Qt.ArrowCursor))

    # 一般 paintEvent 在窗体首次绘制加载, 要重新加载paintEvent
    # 需要重新加载窗口使用 self.update() or  self.repaint()
    def paintEvent(self, event):
        painter = QPainter(self)
        #在指定位置绘制图片
        painter.drawPixmap(0, 0, self.width(), self.height(), QPixmap("./images/boy.png"))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = ShapeWidget()
    form.show()
    app.exec_()

运行效果如下
这里我们可以将其与上一个例子放在一起
这里写图片描述

相关源码及素材
https://download.csdn.net/download/jia666666/10616087

猜你喜欢

转载自blog.csdn.net/jia666666/article/details/81874586