PyQt4 的图片切割编辑器

[复制链接]
发表于 2025-11-4 08:55:42 | 显示全部楼层 |阅读模式
一、 编辑器功能明白

允许用户加载图片、选择切割模式、对切割后的图片片断举行操纵(如移动、复制、粘贴、删除等),并支持取消和重做操纵。
环境:Py2.7  PyQt 4.11
在Py2.7 的环境下使用miniconda 安装 pyqt4:
conda install pyqt=4
二、导入模块先容

sys: 用于访问与 Python 表明器强干系的变量和函数。
os: 提供操纵体系干系功能,如文件路径操纵。
random: 用于天生随机数,告急用于主动生存文件名。
json: 用于数据序列化和反序列化,方便生存和加载编辑状态。
glob: 用于文件路径匹配,比方查抄主动生存文件是否存在。
PyQt4: 用于创建图形用户界面(GUI)。
三、构造函数分析

  1. def __init__(self):
  2.     super(MainWindow, self).__init__()  # 调用父类的构造函数
  3.     self.setWindowTitle('Picture Cutting Editor')  # 设置窗口标题
  4.     self.undoStack = QtGui.QUndoStack(self)  # 创建一个QUndoStack对象,用于撤销和重做
  5.     self.initUI()  # 初始化界面
  6.     self.initSignal()  # 初始化信号连接
  7.     self.image = QtGui.QPixmap()  # 初始化图片对象
  8.     self.center()  # 居中显示窗口
  9.     self.xx = 5
  10.     self.yy = 5
  11.     self._m_cut_type_str = ''  # 初始化切割模式字符串
  12.     self.curFile = ''  # 当前文件路径
  13.     self.locationList = []  # 存储图片位置的列表
  14.     self.cuttingWidgetList = []  # 存储切割小部件的列表
  15.     self.posList = []  # 存储位置信息的列表
  16.     self.location_pixmap_dict = {}  # 存储位置和图片的字典
  17.     self.data = [...]  # 存储数据的列表
  18.     self.auto_save_data = [...]  # 自动保存数据
  19.     self.savepath_autopath_dict = {}  # 保存路径和自动保存路径的连接字典
  20.     self.autoName = ''  # 自动保存文件名
复制代码
self.undoStack: 用于支持取消和重做操纵。
self.image: 存储当前加载的图片。
self.data: 存储编辑状态的数据,方便生存和加载。
self.auto_save_data: 存储主动生存的数据,防止数据丢失。
四、扩展的类

      
  • QtGui.QUndoStack(self) # 创建一个QUndoStack对象,用于取消和重做  
  • QtGui.QPixmap() # 存储当前加载的图片,QtGui.QPixmap()可以从文件、资源或内存中加载图像,并可以用于体现图像  
  • QtGui.QFileDialog.getOpenFileName: 打开文件选择对话框,让用户选择图片文件。
五、小本事

1. & 符号
   fileMenu = menubar.addMenu(u'文件(&F)') # 添加“文件”菜单
# 在 PyQt 中,菜单项或按钮的文本中添加 & 符号是一种特殊的语法,用于界说快捷键(Accelerator)。& 符号背面的字母会酿成该菜单项或按钮的快捷键
  2. undoStack
   undoStack的宏操纵(相称于数据库中的事件):将多个操纵绑定在一起,一并取消:
有了undoStack来实现指令的取消和规复真的太轻易了。
  1. undoStack.beginMacro('bind1'):开始一个宏操作,允许将多个命令组合在一起。
  2. undoStack.push(self.cmd1):将命令推入撤销栈,可以推多个命令进入栈中。
  3. undoStack.endMacro():结束宏操作,将所有推入的命令组合为一个。
复制代码
3. 创建一个新的编辑窗口(MainWindow 的实例),并将其体现在屏幕上(QT多窗口模板):
  1.     def newImageFile(self):
  2.         newWindow = MainWindow()  # 创建一个新的 MainWindow 实例
  3.         # 将新窗口实例添加到 windowList 中,以便程序可以统一管理所有打开的窗口。(这是在做商城大作业时的收获,无论是红点对象还是复用滚动框中的滚动对象都建议使用一个列表保存起来。(1. 避免重复创建,减少性能消耗  2.统一管理)
  4.         MainWindow.windowList.append(newWindow)  # 将新窗口添加到窗口列表中
  5.         newWindow.move(self.x() + 50, self.y() + 50)  # 设置新窗口的位置
  6.                 newWindow.show()  # 显示新窗口
复制代码
4. Py2获取当前年代日时分秒,并天生一个年-月-日-时-分-秒的字符串
  1. # 案例:根据当前时间生成新的自动保存文件名
  2.         from datetime import datetime
  3.                 # 获取当前时间
  4.                 now = datetime.now()
  5.                 # 格式化为 "年-月-日-时-分-秒" 的字符串
  6.                 formatted_time = now.strftime("%Y-%m-%d-%H-%M-%S")
  7.                   autoName = 'auto_save/' + formatted_time + '.json'
复制代码
5. Py2 剖析Json文件:
  1.         with open(fileName) as fp:
  2.          load_data = json.load(fp)  # 使用 json.load 从文件中加载 JSON 数据,并将其存储到 self.data 中。
复制代码
六、图片切割编辑器案例

1. 类图



  1. # -*- coding: utf-8 -*-
  2. import sys
  3. import os
  4. import random
  5. import json
  6. import glob
  7. from PyQt4 import QtGui
  8. from PyQt4 import QtCore
  9. # 定义主窗口类
  10. class MainWindow(QtGui.QMainWindow):
  11.     windowList = []  # 用于存储所有打开的窗口
  12.     def __init__(self):
  13.         super(MainWindow, self).__init__()
  14.         self.setWindowTitle(u'拼图游戏')
  15.         self.undoStack = QtGui.QUndoStack(self)  # 创建一个QUndoStack对象,用于撤销和重做
  16.         self.initUI()      # 初始化界面,设置菜单、工具栏等。
  17.         self.initSignal()  # 初始化信号连接,绑定事件处理函数。
  18.         self.image = None  # 存储当前加载的图片,QtGui.QPixmap()可以从文件、资源或内存中加载图像,并可以用于显示图像
  19.         self.center()      # 居中显示窗口
  20.         self.xx = 5
  21.         self.yy = 5        # 初始化切割网格的行列数,默认为5x5。
  22.         self._m_cut_type_str = ''  # 初始化切割模式字符串,用于描述当前的切割方式。
  23.         self.curFile = ''          # 当前编辑的文件路径。
  24.         self.locationList = []     # 存储图片片段的位置信息。
  25.         self.cuttingWidgetList = []  # 存储切割后的小部件(如图片片段)。
  26.         self.posList = []          # 存储图片片段的位置信息。
  27.         self.location_pixmap_dict = {}  # 存储位置与图片片段的映射关系。
  28.         self.data = [              # 存储编辑状态的数据,方便保存和加载。
  29.             {
  30.                 'path': [],  # 存储文件路径
  31.                 'type': [],  # 存储切割类型
  32.                 'location_list': [],  # 存储位置列表
  33.                 'square_list': [],    # 存储切割小部件列表
  34.                 'pos_list': [],       # 存储位置信息列表
  35.             }
  36.         ]
  37.         self.auto_save_data = [  # 存储自动保存的数据,防止数据丢失。
  38.             {
  39.                 'autoSavePath': [],  # 自动保存路径列表
  40.                 'connectDict': {},   # 自动保存路径和文件路径的连接字典
  41.             }
  42.         ]
  43.         self.savepath_autopath_dict = {}  # 保存路径和自动保存路径的连接字典
  44.         self.autoName = ''  # 自动保存文件名
  45.         self.status_bar = None  # 创建一个状态栏
  46.     def init(self):
  47.         # 初始化、清空数据结构,重置状态
  48.         self.locationList = []  # 清空图片位置信息列表
  49.         self.cuttingWidgetList = []  # 清空切割小部件列表
  50.         self.posList = []  # 清空位置信息列表
  51.         self.location_pixmap_dict = {}  # 清空位置与图片片段的映射字典
  52.         self.data = [  # 重置存储编辑状态的数据结构
  53.             {
  54.                 'path': [],  # 清空文件路径列表
  55.                 'type': [],  # 清空切割类型列表
  56.                 'location_list': [],  # 清空位置列表
  57.                 'square_list': [],    # 清空切割小部件列表
  58.                 'pos_list': [],       # 清空位置信息列表
  59.             }
  60.         ]
  61.         self.auto_save_data = [  # 重置自动保存数据结构
  62.             {
  63.                 'autoSavePath': [],  # 清空自动保存路径列表
  64.                 'connectDict': {}    # 清空自动保存路径与文件路径的映射字典
  65.             }
  66.         ]
  67.         self.savepath_autopath_dict = {}   # 清空保存路径与自动保存路径的映射字典
  68.         self.piecesList.clear()            # 清空图片片段列表组件
  69.         self.piecesList.locationList = []  # 清空图片片段位置列表
  70.         self.picWidget.cuttingWidgetList = []  # 清空图片编辑区域的切割小部件列表
  71.         self.picWidget.pixmapList = []  # 清空图片编辑区域的图片片段列表
  72.         self.picWidget.posList = []     # 清空图片编辑区域的位置信息列表
  73.         self.picWidget.update()         # 更新图片编辑区域的显示
  74.         self.status_bar = None  # 清空状态栏
  75.     # 初始化用户界面(UI)
  76.     def initUI(self):
  77.         # 创建一个状态栏
  78.         self.status_bar = QtGui.QStatusBar()
  79.         self.setStatusBar(self.status_bar)
  80.         # 显示一条状态消息
  81.         self.status_bar.showMessage(u"欢迎游玩拼图游戏!", 3000)  # 消息停留 3000 毫秒(3秒)
  82.         # 设置状态栏的样式表
  83.         self.statusBar().setStyleSheet("""
  84.             QStatusBar {
  85.                 background-color: lightgreen;
  86.             }
  87.         """)
  88.         self.setFocus()    # 设置窗口获取焦点, 确保窗口获取焦点。
  89.         self.setWidgets()  # 调用自定义的setWidgets方法,设置主窗口的窗口显示内容
  90.         # 创建菜单栏和导航栏的选项
  91.         openFile = QtGui.QAction(QtGui.QIcon('resources/openFile.png'), 'Open', self)
  92.         openFile.setShortcut('Ctrl+O')  # 设置快捷键
  93.         openFile.setStatusTip('Open new file')  # 设置状态栏提示
  94.         self.connect(openFile, QtCore.SIGNAL('triggered()'), self.openFile)  # 将动作与槽函数连接
  95.         newFile = QtGui.QAction(QtGui.QIcon('resources/new.png'), 'New', self)
  96.         newFile.setShortcut('Ctrl+N')
  97.         newFile.setStatusTip('New file')
  98.         self.connect(newFile, QtCore.SIGNAL('triggered()'), self.newImageFile)
  99.         # 导入图片,选择网格大小
  100.         importImage = QtGui.QAction('Import Image', self)
  101.         importImage.setStatusTip('Import image')
  102.         self.connect(importImage, QtCore.SIGNAL('triggered()'), self.showDialog)
  103.         saveFile = QtGui.QAction(QtGui.QIcon('resources/save.png'), 'Save', self)
  104.         saveFile.setShortcut('Ctrl+S')
  105.         saveFile.setStatusTip('Save file')
  106.         self.connect(saveFile, QtCore.SIGNAL('triggered()'), self.saveImageFile)
  107.         save_as = QtGui.QAction(QtGui.QIcon('resources/save_as.png'), 'Save As', self)
  108.         save_as.setShortcut('Ctrl+Shift+S')
  109.         save_as.setStatusTip('Save file as')
  110.         self.connect(save_as, QtCore.SIGNAL('triggered()'), self.saveImageAs)
  111.         undo = QtGui.QAction(QtGui.QIcon('resources/Undo.png'), 'Undo', self)
  112.         undo.setShortcut('Ctrl+Z')
  113.         undo.setStatusTip('Undo')
  114.         self.connect(undo, QtCore.SIGNAL('triggered()'), self.undoImage)
  115.         redo = QtGui.QAction(QtGui.QIcon('resources/Redo.png'), 'Redo', self)
  116.         redo.setShortcut('Ctrl+Y')
  117.         redo.setStatusTip('Redo')
  118.         self.connect(redo, QtCore.SIGNAL('triggered()'), self.redoImage)
  119.         cut = QtGui.QAction(QtGui.QIcon('resources/cut.png'), 'Cut', self)
  120.         cut.setShortcut('Ctrl+X')
  121.         cut.setStatusTip('Cut')
  122.         self.connect(cut, QtCore.SIGNAL('triggered()'), self.cutImage)
  123.         copyImage = QtGui.QAction(QtGui.QIcon('resources/copy.png'), 'Copy', self)
  124.         copyImage.setShortcut('Ctrl+C')
  125.         copyImage.setStatusTip('Copy')
  126.         self.connect(copyImage, QtCore.SIGNAL('triggered()'), self.copyImage)
  127.         pasteImage = QtGui.QAction(QtGui.QIcon('resources/paste.png'), 'Paste', self)
  128.         pasteImage.setShortcut('Ctrl+V')
  129.         pasteImage.setStatusTip('Paste')
  130.         self.connect(pasteImage, QtCore.SIGNAL('triggered()'), self.pasteImage)
  131.         deleteImage = QtGui.QAction(QtGui.QIcon('resources/delete.png'), 'Delete', self)
  132.         deleteImage.setShortcut('Delete')
  133.         deleteImage.setStatusTip('delete')
  134.         self.connect(deleteImage, QtCore.SIGNAL('triggered()'), self.deleteImage)
  135.         # 创建菜单栏
  136.         menubar = self.menuBar()  # 获取窗口的菜单栏
  137.         # 文件
  138.         fileMenu = menubar.addMenu(u'文件(&F)')  # 添加“文件”菜单
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表