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的知识。