pyqt5 窗口设置圆角_PyQt5 窗口绘图类控件

15 窗口绘图类控件

PyQt5 绘图系统能渲染矢量图像、位图图像和轮廓字体文本。当我们想要更改或增强现有小部件,或者我们从头开始创建自定义小部件时,应用程序需要绘制。要进行绘图,我们使用 PyQt5 工具包提供的绘画 API。

在 PyQt5 中,一般可以通过 QPainter、QPen 和 QBrush 这三个类来实现绘图功能。此外,QPixmap 的作用是加载并呈现本地图像,而图像的呈现本质上也是通过绘图方式实现的,所以 QPixmap 也可以被视为绘图的一个类。

15.1 QPainter

QPainter 类在 QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使用 QPainter 类可以绘制从简单的直线到复杂的饼图等。它也可以画文本和图像。QPainter 可以在任何继承自 QPaintDevice 的对象上进行绘制。QpaintDevice 子类有QImage、QOpenGLPaintDevice、QWidget 等。所以, QPainter 可以在QImage、QOpenGLPaintDevice、QWidget 上进行绘制图形。

Painter的核心功能是绘图,但该类还提供了几个功能,允许您自定义QPainter的设置及其渲染质量,以及其他启用剪切的功能。此外,您可以通过指定painter的合成模式来控制不同形状的合并方式。

绘制操作在 QWidget.paintEvent() 中完成。绘制方法必须放在 QtGui.QPainter 对象的 begin() 和 end() 之间。isActive() 函数指示painter 是否处于活动状态。painter 由 begin() 函数和带有 QPaintDevice 参数的构造函数激活。end()函数和析构函数将其停用。

QPainter 类在控件或其他绘图设备上执行较低级别的图形绘制功能,并通过如下所示的方法进行绘制。

方法

描述begin()

开始在目标设备上绘制

drawArc()

在起始角度和最终角度之间画弧

drawEllipse()

在一个矩形内画一个椭圆

drawLine(int x1,int y1,int x2,int y2)

绘制一条指定了端点坐标的线

drawPixmap()

从图像文件中提取Pixmap并将其显示在指定的位置

drawPolygon()

使用坐标数组绘制多边形

drawRect(int x,int y,int w,int h)

以给定的高度和宽度从左上角坐标(x,y)绘制一个矩形

drawText()

显示给定坐标处的文字

fillRect()

使用QColor参数填充矩形

setBrush()

设置画笔风格

setPen()

设置用于绘制的笔的颜色、大小和样式

还可以设置画笔风格(PenStyle),这是一个枚举类,可以由 QPainter 类绘制。画笔风格如表:

枚举类型

描述Qt.NoPen

没有线

Qt.SolidLine

一条简单的线

Qt.DashLine

由一些像素分隔的短线

Qt.DotLine

由一些像素分隔的点

Qt.DashDotLine

轮流交替的点和短线

Qt.DashDotDotLine

一条短线,两个点

Qt.MPenStyle

画笔风格的掩码

一般的使用方法是:

def paintEvent(self, paintEvent):

painter = QPainter(self)

painter.setPen(Qt.blue)

painter.setFont(QFont("Arial", 30))

painter.drawText(rect(), Qt.AlignCenter, "Qt")

Painter 与 QPaintDevice 和 QPaintEngine 类一起构成了 Qt 绘画系统的基础。QPainter 是用于执行绘图操作的类。QPaintDevice 表示可以使用 QPainter 绘制的设备。 QPaintEngine 提供 painter 用于绘制到不同类型设备上的界面。如果 painter 处于活动状态,则 device() 返回 painter 绘制的绘图设备,paintEngine() 返回 painter 当前正在操作的绘制引擎。

有时需要让别人在不寻常的 QPaintDevice 上绘画。 QPainter 支持静态函数来执行此操作,setRedirected()。

警告:当 paintdevice 是一个小部件时,QPainter 只能在 paintEvent() 函数内或 paintEvent() 调用的函数中使用。

您可以根据自己的喜好自定义几种设置以进行 QPainter 绘制:

font() 是用于绘制文本的字体。如果 painter isActive(),您可以分别使用 fontInfo() 和 fontMetrics() 函数检索有关当前设置字体及其度量的信息。

brush() 定义用于填充形状的颜色或图案。

pen() 定义用于绘制线条或边界的颜色或点画。

backgroundMode() 定义是否有 background(),即它是 Qt.OpaqueMode 或 Qt.TransparentMode 的实例。

background() 仅在 backgroundMode() 为 Qt.OpaqueMode 且 pen() 为点画时适用。在这种情况下,它描述了点画中背景像素的颜色。

brushOrigin() 定义平铺画笔的原点,通常是小部件背景的原点。

viewport(),window(),worldTransform() 组成 painter 的坐标转换系统。

hasClipping()告诉 painter 是否剪切。

layoutDirection() 定义绘制文本时 painter 使用的布局方向。

worldMatrixEnabled()指示是否启用了世界转换。

viewTransformEnabled()指示是否启用了视图转换。

请注意,其中一些设置会镜像某些绘图设备中的设置,例如: QWidget.font() 和 QPainter.begin() 函数(或等效的 QPainter 构造函数)从 paint 设备复制这些属性。

您可以通过调用 save() 函数随时保存 QPainter 的状态,该函数将所有可用设置保存在内部堆栈中。restore() 函数会弹回它们,即恢复原先的状态。

QPainter 提供绘制大多数基元的函数:drawPoint(),drawPoints(),drawLine(),drawRect(),drawRoundedRect(),drawEllipse(),drawArc(),drawPie(),drawChord(),drawPolyline(),drawPolygon(),drawConvexPolygon() 和 drawCubicBezier()。两个便捷函数 drawRects() 和 drawLines() 使用当前的笔和画笔在给定的 QRects 或 QLines 数组中绘制给定数量的矩形或线。

QPainter 类还提供 fillRect() 函数,该函数使用给定的 QBrush 填充给定的 QRect,以及擦除给定矩形内的区域的 eraseRect() 函数。

15.1.1 文本涂鸦

import sys

from PyQt5.QtWidgets import QApplication, QWidget

from PyQt5.QtGui import QPainter, QColor, QFont

from PyQt5.QtCore import Qt

class Drawing(QWidget):

def __init__(self, parent=None):

super().__init__(parent)

self.setWindowTitle("在窗体中绘画出文字例子")

self.resize(300, 200)

self.text = '欢迎学习 PyQt5'

def paintEvent(self, event):

painter = QPainter()

painter.begin(self)

# 自定义的绘画方法

self.drawText(event, painter)

painter.end()

def drawText(self, event, qp):

# 设置笔的颜色

qp.setPen(QColor(168, 34, 3))

# 设置字体

qp.setFont(QFont('SimSun', 20))

# 画出文本

qp.drawText(event.rect(), Qt.AlignCenter, self.text)

if __name__ == "__main__":

app = QApplication(sys.argv)

demo = Drawing()

demo.show()

sys.exit(app.exec_())

效果:

15.1.2 点的绘画

import sys, math

from PyQt5.QtWidgets import QApplication, QWidget

from PyQt5.QtGui import QPainter

from PyQt5.QtCore import Qt

class Drawing(QWidget):

def __init__(self, parent=None):

super().__init__(parent)

self.resize(300, 200)

self.setWindowTitle("在窗体中画点")

def paintEvent(self, event):

qp = QPainter()

qp.begin(self)

# 自定义画点方法

self.drawPoints(qp)

qp.end()

def drawPoints(self, qp):

qp.setPen(Qt.red)

size = self.size() # 得到窗口的当前大小

for i in range(1000):

# [-100, 100] 两个周期的正弦函数图像

x = 100 * (-1+2.0*i/1000) + size.width()/2.0

y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) + size.height()/2.0

qp.drawPoint(x, y)

if __name__ == '__main__':

app = QApplication(sys.argv)

demo = Drawing()

demo.show()

sys.exit(app.exec_())

效果:

15.1.3 在 QLabel 上画图

前面都是在 QWidget 上绘制图形的,也可以在 QLabel 上绘制:

import sys

from PyQt5 import QtCore, QtGui, QtWidgets

from PyQt5.QtCore import Qt

class MainWindow(QtWidgets.QMainWindow):

def __init__(self):

super().__init__()

self.label = QtWidgets.QLabel()

canvas = QtGui.QPixmap(400, 300)

self.label.setPixmap(canvas)

self.setCentralWidget(self.label)

self.draw_something()

def draw_something(self):

painter = QtGui.QPainter(self.label.pixmap())

painter.setPen(Qt.red)

painter.drawLine(10, 10, 300, 200)

painter.end()

app = QtWidgets.QApplication(sys.argv)

window = MainWindow()

window.show()

app.exec_()

效果:

Method

DescriptiondrawLine(line)

Draw a QLine instance

drawLine(line)

Draw a QLineF instance

drawLine(x1, y1, x2, y2)

Draw a line between x1, y2 and x2, y2 (int)

drawLine(p1, p2)

Draw a line between p1 and p2 (both QPoint)

drawLine(p1, p2)

Draw a line between p1 and p2 (both QPointF)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值