PyQt5实现画布小程序

1. 简介

PyQt5是一个Python GUI编程工具包,可用于创建桌面应用程序。本篇文章将介绍如何使用PyQt5创建一个画布小程序。

2. 准备工作

在开始之前,确保已经安装PyQt5和Python 3。可以使用以下命令来安装PyQt5:

pip install PyQt5

3. 创建画布

3.1 导入必要模块

首先,需要导入必要的模块。

from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsItem

from PyQt5.QtGui import QPen, QColor, QBrush, QPainterPath

from PyQt5.QtCore import Qt

这些模块分别用于创建应用程序、主窗口、场景、视图和图形项。其中,QGraphicsItem是所有Qt图形项的基类。

3.2 创建画布图形项

创建一个名为Canvas的图形项类,用于绘制图形。

class Canvas(QGraphicsItem):

def __init__(self):

super().__init__()

self.pen = QPen()

self.pen.setWidth(2)

self.pen.setColor(QColor(0, 0, 0))

self.path = QPainterPath()

self.brush = QBrush()

self.brush.setColor(QColor(255, 255, 255))

self.brush.setStyle(Qt.SolidPattern)

def boundingRect(self):

return self.path.boundingRect()

def paint(self, painter, option, widget=None):

painter.setPen(self.pen)

painter.setBrush(self.brush)

painter.drawPath(self.path)

在这个类中,使用了QPainterPath对象存储绘制图形的信息,使用QPen和QBrush对象分别设置画笔和填充的颜色和样式。在paint方法中,使用这些设置进行绘制。

3.3 创建场景和视图

创建名为DrawWindow的主窗口类,并在其中创建场景和视图。

class DrawWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('Draw Window')

self.setGeometry(100, 100, 640, 480)

self.scene = QGraphicsScene(self)

self.view = QGraphicsView(self.scene, self)

self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.view.setGeometry(0, 0, 640, 480)

self.canvas = Canvas()

self.scene.addItem(self.canvas)

在这个类中,使用QGraphicsScene对象创建“场景”,QGraphicsView对象创建“视图”,并设置视图的大小和滚动条策略。使用Canvas对象创建“画布”,并将它添加到场景中。

4. 绘制图形

4.1 绘制直线

添加如下代码,可以绘制一条直线:

def mousePressEvent(self, event):

if event.button() == Qt.LeftButton:

x, y = event.scenePos().x(), event.scenePos().y()

self.canvas.path.moveTo(x, y)

self.canvas.path.lineTo(x+50, y+50)

self.canvas.update()

在这个方法中,判断鼠标是否按下,如果是左键按下,则获取鼠标在场景中的坐标,并使用QPainterPath的方法绘制一条直线。最后,调用canvas的update方法更新绘制。

4.2 绘制矩形

添加如下代码,可以绘制一个矩形:

def mousePressEvent(self, event):

if event.button() == Qt.LeftButton:

x, y = event.scenePos().x(), event.scenePos().y()

self.canvas.path.addRect(x, y, 50, 50)

self.canvas.update()

在这个方法中,使用QPainterPath的addRect方法绘制一个矩形。其他部分与绘制直线类似。

4.3 绘制椭圆

添加如下代码,可以绘制一个椭圆:

def mousePressEvent(self, event):

if event.button() == Qt.LeftButton:

x, y = event.scenePos().x(), event.scenePos().y()

self.canvas.path.addEllipse(x, y, 50, 50)

self.canvas.update()

在这个方法中,使用QPainterPath的addEllipse方法绘制一个椭圆。其他部分与绘制直线类似。

5. 运行程序

添加如下代码,运行程序:

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = DrawWindow()

window.show()

sys.exit(app.exec_())

6. 完整程序代码

from PyQt5.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsItem

from PyQt5.QtGui import QPen, QColor, QBrush, QPainterPath

from PyQt5.QtCore import Qt

class Canvas(QGraphicsItem):

def __init__(self):

super().__init__()

self.pen = QPen()

self.pen.setWidth(2)

self.pen.setColor(QColor(0, 0, 0))

self.path = QPainterPath()

self.brush = QBrush()

self.brush.setColor(QColor(255, 255, 255))

self.brush.setStyle(Qt.SolidPattern)

def boundingRect(self):

return self.path.boundingRect()

def paint(self, painter, option, widget=None):

painter.setPen(self.pen)

painter.setBrush(self.brush)

painter.drawPath(self.path)

class DrawWindow(QMainWindow):

def __init__(self):

super().__init__()

self.setWindowTitle('Draw Window')

self.setGeometry(100, 100, 640, 480)

self.scene = QGraphicsScene(self)

self.view = QGraphicsView(self.scene, self)

self.view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.view.setGeometry(0, 0, 640, 480)

self.canvas = Canvas()

self.scene.addItem(self.canvas)

def mousePressEvent(self, event):

if event.button() == Qt.LeftButton:

x, y = event.scenePos().x(), event.scenePos().y()

self.canvas.path.moveTo(x, y)

self.canvas.path.lineTo(x+50, y+50)

self.canvas.update()

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = DrawWindow()

window.show()

sys.exit(app.exec_())

7. 总结

本篇文章通过创建一个画布小程序,介绍了如何使用PyQt5创建应用程序、主窗口、场景、视图和图形项,以及如何绘制图形。希望读者能够根据本文以及Qt官方文档,学习更多PyQt5的知识。

后端开发标签