139-QPainter和Graphics/View绘图-QPainter绘图-裁剪区域QRegion

裁剪区域QRegion

QPainter 中有关裁剪区域的方法

当所绘图形比较大时,若只想显示绘图上的一部分区域的内容,其他区域的内容不显示,就需要使用裁剪区域。

用QPainter 设置裁剪区域的方法如表所示其中参数op是Qt.ClipOperation 的枚举值,可以取:

  • Qt.NoClipQt.ReplaceClip(替换裁剪区域)
  • Qt.IntersectClip(与现有裁区域取交集)
QPainter设置裁剪区域的方法说明
setClipping(bool)设置是否启用裁剪区域
hasClipping()获取是否有裁剪区域
setClipPath(path: QPainterPath,op: :Qt.ClipOperation=Qt.ReplaceClip)用路径设置裁剪区域
setClipRect(Union[QRectF,QRect],op: Qt.ClipOperation=Qt.ReplaceClip)用矩形框设置裁剪区域
setClipRect(x: int,y: int,w: int,h: int,op: Qt.ClipOperation=Qt.ReplaceClip)用矩形框设置裁剪区域
setClipRegion(Union[QRegion,QBitmap,QPolygon,QRect],op: Qt.ClipOperation=Qt.ReplaceClip)用QRegion设置裁剪区域
clipBoundingRect()获取裁剪区域QRectF
clipPath()获取裁剪区域绘图路径 QPainterPath
clipRegion()获取裁剪区域 QRegion
QRegion的方法

QRegion类专门用于定义裁剪区域,QWidget 的 repaint()方法可以接受 QRegion参数,限制刷新的范围。用QRegion 类创建裁剪区域实例的方法如下,其中t是QRegion.RegionType枚举类型,可以取 :

  • QRegion.Rectangle
  • QRegion.Ellipse
from PySide6.QtGui import QRegion

QRegion(self)-> None
QRegion(bitmap: Union[PySide6.QtGui.QBitmap,str])-> None
QRegion(pa: Union[PySide6.QtGui.QPolygon,Sequence[PySide6.QtCore.QPoint],PySide6.QtCore.QRect],fillRule: PySide6.QtCore.Qt.FillRule = Instance(Qt.OddEvenFill))-> None
QRegion(r: PySide6.QtCore.QRect,t: PySide6.QtGui.QRegion.RegionType = Instance(PySide6.QtGui.QRegion.RegionType.Rectangle))-> None
QRegion(region: Union[PySide6.QtGui.QRegion,PySide6.QtGui.QBitmap,PySide6.QtGui.QPolygon,PySide6.QtCore.QRect])-> None
QRegion(x: int,y: int,w: int,h: int,t: PySide6.QtGui.QRegion.RegionType = Instance(PySide6.QtGui.QRegion.RegionType.Rectangle))-> None

QRegion 的常用方法如表所示主要方法介绍如下

QRegion的方法及参数类型返回值类型说明
boundingRect()QRect获取边界
contains(QPoint)bool获取是否包含指定的点
contains(QRect)bool获取是否包含矩形
intersects(Union[QRegion,QBitmap,QPolygon,QRect])bool获取是否与区域相交
isEmpty()bool获取是否为空
isNull()bool获取是否无效
setRects(rect:QRect,num:int)None设置多个矩形区域
rectCount()int获取矩形区域的数量
begin()、cbegin()QRect获取第一个非重合矩形
end()、cend()QRect获取最后一个非重合矩形
intersected(Union[QRegion,QBitmap,QPolygon,QRect])QRegion获取相交区域
subtracted(Union[QRegion,QBitmap,QPolygon,QRect])QRegion获取减去区域后的区域
united(Union[QRegion,QBitmap,QPolygon,QRect])QRegion获取合并后的区域
xored(Union[QRegion,QBitmap,QPolygon,QRect])QRegion获取异或区域
translate(dx: int,dy:int)QRegion获取平移后的区域
1ranslated(QPoint)QRegion获取平移后的区域
swap(Other:Union[QRegion,QBitmap,QPolygon,QRect])None交换区域
translate(dx:int,dy:int)None平移区域
translate(p: QPoint)None平移区域
  • QRegion可以进行交、减并和异或运算,这些运的示意图如图所示

image-20230308155714887

  • 用setRects(Sequence[QRect])方法可以设置多个矩形区域,多个矩形之间不能相互交叉,处于同一层的矩形必须有相同的高度,而不能连在一起,多个矩形可以合并成一个矩形。多个矩形首先按 值以升序排列,其次按 x值以升序排列。
QRegion 的应用实例

下面的程序将一个图像绘制到窗口中,只显示两个矩形和两个椭圆形区域内的图像,程序运行结果如图所示。

image-20230308160857526

# -*- coding: UTF-8 -*-
# File date: Hi_2023/3/8 15:58
# File_name: 09- QRegion 的应用实例.py


from PySide6.QtWidgets import QApplication,QWidget,QGraphicsWidget
from PySide6.QtGui import QPainter,QPixmap,QPainterPath,QBrush,QRegion
from PySide6.QtCore import QRect,Qt
import sys,os


class MyWindow(QWidget):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.resize(600,500)
        self.__pixmap = QPixmap("../../Resources/Images/正方形.png")

    def paintEvent(self,event):
        painter = QPainter(self)# 未确定绘图设备
        painter.setClipping(True)

        rect_1 = QRect(self.width()/ 20,self.height()/ 10,self.width()/ 10 * 4,self.height()/ 10 * 3)
        rect_2 = QRect(self.width()/ 20,self.height()/ 10 * 5,self.width()/ 10 * 4,self.height()/ 10 * 3)
        rect_3 = QRect(self.width()/ 20 * 11,self.height()/ 10,self.width()/ 10 * 4,self.height()/ 10 * 3)
        rect_4 = QRect(self.width()/ 20 * 11,self.height()/ 10 * 5,self.width()/ 10 * 4,self.height()/ 10 * 3)

        region_1 = QRegion(rect_1)# 矩形剪切区域
        region_2 = QRegion(rect_2)# 矩形剪切区域
        region_3 = QRegion(rect_3,t=QRegion.Ellipse)# 椭圆形剪切区域
        region_4 = QRegion(rect_4,t=QRegion.Ellipse)# 椭圆形剪切区域

        region = region_1.united(region_2)# 剪切区域并运算
        region = region.united(region_3)# 剪切区域并运算
        region = region.united(region_4)# 剪切区域并运算

        painter.setClipRegion(region)# 在窗口上绘制图像
        painter.drawPixmap(self.rect(),self.__pixmap)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()

    win.show()
    sys.exit(app.exec())

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

士别三日,当挖目相待

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值