裁剪区域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可以进行交、减并和异或运算,这些运的示意图如图所示
- 用setRects(Sequence[QRect])方法可以设置多个矩形区域,多个矩形之间不能相互交叉,处于同一层的矩形必须有相同的高度,而不能连在一起,多个矩形可以合并成一个矩形。多个矩形首先按 值以升序排列,其次按 x值以升序排列。
QRegion 的应用实例
下面的程序将一个图像绘制到窗口中,只显示两个矩形和两个椭圆形区域内的图像,程序运行结果如图所示。
# -*- 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())