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 – 如何隐藏标签 | label.setHidden方法

    PyQt5是Python语言编写的图形用户界面(GUI)框架,其中包括了标签(Label)控件。通过调用label.setHidden方法,可以隐藏标签控件。在本文中,我们将详细讲解如何使用该方法隐藏标签控件,并提供两个示例说明。 一、隐藏标签 要隐藏标签,只需调用label.setHidden(True)方法即可。该方法需要布尔类型的参数,当参数为True…

    python 2023年5月10日
    00
  • PyQt5 – 点击时隐藏按钮

    下面是关于Python的PyQt5 – 点击时隐藏按钮的完整使用攻略: 1. 概述 在PyQt5中,我们可以通过 QPushButton 控件来实现一个按钮,同时我们也可以为控件添加点击事件。在实际的开发中,我们可能需要在按钮被点击时隐藏该按钮。本篇文章将提供两种方法来实现这个需求。 2. 方法一:使用信号和槽函数 在PyQt5中,信号和槽函数的使用非常广泛…

    python 2023年5月10日
    00
  • PyQt5 最新内容

    PyQt5 最新内容使用攻略 PyQt5 是一个基于 Qt 库的 Python GUI 开发工具包,其最新版本包含众多更新内容,包括但不限于以下几点: Qt 5.15.0 版本的支持 引用 Python 3.9.0 版本 新的 QOpenGLWidget 对高 DPI 显示的支持提升 接下来,我们将详细讲解 PyQt5 最新内容的使用攻略。 安装 PyQt5…

    python 2023年5月12日
    00
  • PyQt5 – 如何改变现有按钮的文本

    对于Python中PyQt5库,当我们需要更改已有窗口元素控件的文本时,有多种方法可以实现。下面详细介绍这些方法。 1.使用QPushButton类的setText()方法 我们可以使用QPushButton控件的setText()方法来更改按钮的文本。示例如下: import sys from PyQt5.QtWidgets import QApplica…

    python 2023年5月10日
    00
  • PyQt5 QDial 设置包覆属性

    对于Python中的PyQt5库,我们可以使用QDial小部件来实现类似于旋钮的滑块功能。QDial支持多个属性,其中包括范围、步长、当前值和刻度线等属性。除了这些基本的属性之外,QDial还支持包覆属性,这些属性允许我们在QDial外部设置控件样式。在本文中,我们将详细讲解如何使用PyQt5来设置QDial的包覆属性。 1. 设置包覆属性 首先,我们需要导…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget – 点击的信号

    PyQt5是一个Python的GUI编程框架,其中QCalendarWidget是Qt中的日历小部件,可以方便地选择日期,并且可以使用信号和槽来捕获用户与日历控件的交互事件。本文将为大家详细讲解如何使用“PyQt5 QCalendarWidget-点击的信号”。 1. 信号的概念 在PyQt5中,“信号”是一种事件传输的机制,代表“某个特定事件已经发生了”,…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget – 获取方向属性

    PyQt5中的QCalendarWidget控件提供了一种交互式日历用户界面,通过它可以为用户提供日期的选择。其中有一个获取方向属性的方法可以帮助我们获取日历部件的布局方向,下面我们来详细讲解其完整使用攻略。 QCalendarWidget的获取方向属性 QCalendarWidget提供了setFirstDayOfWeek()和firstDayOfWeek…

    python 2023年5月12日
    00
  • PyQt5 QCalendarWidget 设置背景色

    让我们来详细讲解一下Python中如何使用PyQt5 QCalendarWidget设置背景色的完整使用攻略。 环境准备 在使用PyQt5 QCalendarWidget设置背景色前,需要先安装Qt和PyQt5的开发环境。可以通过以下命令安装: sudo apt-get install qt5-default pyqt5-dev pyqt5-dev-tool…

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