PyQt5–创建绘画应用

下面是关于“PyQt5--创建绘画应用”的完整使用攻略。

1. 准备工作

在开始创建绘画应用之前,需要进行一些准备工作,分别是安装PyQt5和导入相关模块。

1.1 安装PyQt5

可以使用pip命令来安装PyQt5,具体命令如下:

pip install PyQt5

1.2 导入相关模块

在创建绘画应用时,需要使用到以下几个模块:

import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QImage, QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog

2. 创建绘画应用

在准备工作完成之后,就可以创建绘画应用了,主要分为以下几个部分。

2.1 继承QMainWindow类

需要从QMainWindow类继承一个新类DrawingApp,继承过程中需要重写初始化方法和重载绘图事件方法。

class DrawingApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("绘画应用")
        self.setGeometry(100, 100, 800, 600)

        # 初始化画布,填充为白色
        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)

        # 记录画笔位置和画笔状态
        self.last_point = QPoint()
        self.drawing = False

        # 初始化画笔样式
        self.pen = QPen(Qt.black)
        self.pen.setWidth(2)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())

2.2 创建菜单栏和工具栏

需要在创建的类中添加菜单栏和工具栏,分别添加文件菜单和画笔颜色工具。

class DrawingApp(QMainWindow):

    def __init__(self):
        super().__init__()

        # ...

        # 创建菜单栏
        main_menu = self.menuBar()
        file_menu = main_menu.addMenu("文件")

        # 添加菜单项
        open_file_action = QAction("打开", self)
        open_file_action.setShortcut("Ctrl+O")
        open_file_action.triggered.connect(self.open_file_dialog)

        save_file_action = QAction("保存", self)
        save_file_action.setShortcut("Ctrl+S")
        save_file_action.triggered.connect(self.save_file_dialog)

        file_menu.addAction(open_file_action)
        file_menu.addAction(save_file_action)

        # 创建工具栏
        toolbar = self.addToolBar("画笔颜色")
        toolbar.setMovable(False)

        # 添加工具项
        color_action = QAction("画笔颜色", self)
        color_action.triggered.connect(self.color_picker)

        toolbar.addAction(color_action)

2.3 添加绘图事件处理函数

当鼠标按下并移动时,需要记录鼠标位置,以此来进行绘图。

class DrawingApp(QMainWindow):
    # ...

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.last_point = event.pos()
            self.drawing = True

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton and self.drawing:
            painter = QPainter(self.image)
            painter.setPen(self.pen)
            painter.drawLine(self.last_point, event.pos())
            self.last_point = event.pos()
            self.update()

2.4 添加文件读写和画笔颜色选择函数

class DrawingApp(QMainWindow):
    # ...

    def open_file_dialog(self):
        file_path, _ = QFileDialog.getOpenFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.load(file_path)
            self.update()

    def save_file_dialog(self):
        file_path, _ = QFileDialog.getSaveFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.save(file_path)

    def color_picker(self):
        chosen_color = QColorDialog.getColor()
        if chosen_color.isValid():
            self.pen.setColor(chosen_color)

3. 示例说明

下面给出两个完整的示例,分别展示如何打开图片和如何使用不同颜色的画笔绘图。

3.1 打开图片

import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QImage, QPainter, QPen
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog

class DrawingApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("绘画应用")
        self.setGeometry(100, 100, 800, 600)

        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)

        self.last_point = QPoint()
        self.drawing = False

        self.pen = QPen(Qt.black)
        self.pen.setWidth(2)

        main_menu = self.menuBar()
        file_menu = main_menu.addMenu("文件")

        open_file_action = QAction("打开", self)
        open_file_action.setShortcut("Ctrl+O")
        open_file_action.triggered.connect(self.open_file_dialog)

        save_file_action = QAction("保存", self)
        save_file_action.setShortcut("Ctrl+S")
        save_file_action.triggered.connect(self.save_file_dialog)

        file_menu.addAction(open_file_action)
        file_menu.addAction(save_file_action)

    def open_file_dialog(self):
        file_path, _ = QFileDialog.getOpenFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.load(file_path)
            self.update()

    def save_file_dialog(self):
        file_path, _ = QFileDialog.getSaveFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.save(file_path)

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.last_point = event.pos()
            self.drawing = True

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton and self.drawing:
            painter = QPainter(self.image)
            painter.setPen(self.pen)
            painter.drawLine(self.last_point, event.pos())
            self.last_point = event.pos()
            self.update()

app = QApplication(sys.argv)
window = DrawingApp()
window.show()
sys.exit(app.exec_())

在菜单栏中选择“文件”-“打开”菜单项,即可打开本地的jpg、png、bmp、gif等格式的图片。

3.2 使用不同颜色的画笔绘图

import sys
from PyQt5.QtCore import Qt, QPoint
from PyQt5.QtGui import QImage, QPainter, QPen, QColor
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, QFileDialog, QColorDialog

class DrawingApp(QMainWindow):

    def __init__(self):
        super().__init__()

        self.setWindowTitle("绘画应用")
        self.setGeometry(100, 100, 800, 600)

        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)

        self.last_point = QPoint()
        self.drawing = False

        self.pen = QPen(Qt.black)
        self.pen.setWidth(2)

        main_menu = self.menuBar()
        file_menu = main_menu.addMenu("文件")

        open_file_action = QAction("打开", self)
        open_file_action.setShortcut("Ctrl+O")
        open_file_action.triggered.connect(self.open_file_dialog)

        save_file_action = QAction("保存", self)
        save_file_action.setShortcut("Ctrl+S")
        save_file_action.triggered.connect(self.save_file_dialog)

        file_menu.addAction(open_file_action)
        file_menu.addAction(save_file_action)

        toolbar = self.addToolBar("画笔颜色")
        toolbar.setMovable(False)

        color_action = QAction("画笔颜色", self)
        color_action.triggered.connect(self.color_picker)

        toolbar.addAction(color_action)

    def open_file_dialog(self):
        file_path, _ = QFileDialog.getOpenFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.load(file_path)
            self.update()

    def save_file_dialog(self):
        file_path, _ = QFileDialog.getSaveFileName(self,
            "请选择一个图像文件", ".", "图像文件 (*.jpg *.png *.bmp *.gif)")
        if file_path:
            self.image.save(file_path)

    def color_picker(self):
        chosen_color = QColorDialog.getColor()
        if chosen_color.isValid():
            new_pen = QPen(chosen_color)
            new_pen.setWidth(2)
            self.pen = new_pen

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.last_point = event.pos()
            self.drawing = True

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.drawing = False

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton and self.drawing:
            painter = QPainter(self.image)
            painter.setPen(self.pen)
            painter.drawLine(self.last_point, event.pos())
            self.last_point = event.pos()
            self.update()

app = QApplication(sys.argv)
window = DrawingApp()
window.show()
sys.exit(app.exec_())

在工具栏中选择“画笔颜色”按钮,即可选择不同的画笔颜色。

至此,关于“PyQt5--创建绘画应用”的完整使用攻略已经介绍完毕,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyQt5–创建绘画应用 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • PyQt5 – 在关闭状态下为不可编辑的组合框设置背景图片

    针对您的问题,我会提供详细的使用攻略,以下是完整的步骤和示例: 步骤一:导入必要的库 from PyQt5.QtWidgets import QComboBox, QStyleOptionComboBox, QStyle, QApplication, QWidget from PyQt5.QtGui import QPainter, QPixmap from…

    python 2023年5月10日
    00
  • PyQt5的QColorDialog – 子项

    下面是关于PyQt5的QColorDialog子项的使用攻略: PyQt5的QColorDialog-子项 简介 QColorDialog是PyQt5中的一个颜色选择对话框。除了可以选择颜色之外,还有一些自定义的子项可以使用。子项包括: 当前选择颜色的色块 RGB颜色值 HSV颜色值 HSL颜色值 Alpha透明度值 示例 示例1:基本使用 首先导入必要的库…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget – 检查它是否是给定Widget的祖先

    PyQt5 QCalendarWidget是一个可以方便地在PyQt5应用程序中显示一个日历的小部件。要检查它是否是给定widget的祖先,我们可以使用isAncestorOf()函数。以下是完整的使用攻略: 导入必要模块 from PyQt5.QtWidgets import QWidget, QCalendarWidget 创建一个QWidget 首先,…

    python 2023年5月12日
    00
  • PyQt5 QSpinBox – 获取字体信息对象

    PyQt5是基于Qt框架的Python模块,其中QSpinBox是一个能够实现数字输入的控件,它可以配合Qt的字体设置功能进行个性化定制。QSpinBox提供了setFont()方法来设置字体,并且可以通过font()方法来获取字体信息对象。 以下是获取QSpinBox字体信息对象的完整使用攻略,包含了两个示例: 1. 设置字体 要设置QSpinBox的字体…

    python 2023年5月12日
    00
  • PyQt5 QColorDialog – 测试颜色对话框选项

    Python的PyQt5模块提供了一个QColorDialog类,可以用于选择颜色的对话框。下面是PyQt5 QColorDialog的完整使用攻略: 引入模块和类 首先,需要在Python程序中引入QColorDialog类,可以使用如下代码: from PyQt5.QtWidgets import QColorDialog 创建颜色对话框 接下来,可以使…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget 把它移到父栈的顶部

    PyQt5 QCalendarWidget是一个用于显示月历的GUI控件,可以让用户选择日期和时间。在使用中,有时需要将其移动到父栈(即窗口的顶部),这里为大家提供PyQt5 QCalendarWidget的完整使用攻略,帮助大家实现这个需求。 步骤1:创建QCalendarWidget对象 首先需要创建一个QCalendarWidget对象,代码如下: f…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget 获取窗口标志

    针对“PyQt5 QCalendarWidget获取窗口标志”的完整使用攻略,以下是详细的讲解。 简介 在 PyQt5 中,QCalendarWidget 是常用的一个日期选取控件。不过,在使用 QCalendarWidget 这个控件时,可能需要获取窗口标志(WindowState),以便判断当前窗口是否已经最小化或最大化。那么,如何获取窗口标志呢?下面,…

    python 2023年5月12日
    00
  • PyQt5 QCommandLinkButton – 获取动作列表

    针对您提出的问题,“PyQt5 QCommandLinkButton-获取动作列表”的完整使用攻略,下面就逐步展开: 1. 简介 PyQt5中的QCommandLinkButton类是一种命令按钮,它具有高亮的特点。QCommandLinkButton类扩展了QPushButton类,使其能够容易地创建符合Microsoft Windows用户界面指南的命令…

    python 2023年5月12日
    00
合作推广
合作推广
分享本页
返回顶部