PyQt5项目:记事本

PyQt5项目:记事本

  • 简介
  • 主界面
  • 功能槽
  • 其他
  • 全部代码
  • 成果展示

简介

根据 《快速掌握PyQt5》第二十三章 主窗口QMainWindow
进行重组的一个内容

主界面

def ui_init(self):
        self.setWindowTitle('记事本')
        self.resize(700,400)
        self.text = QTextEdit() # 创建文本对象
        self.layout=QHBoxLayout() # 创建水平布局对象
        self.status_bar = self.statusBar() #创建状态栏对象
        self.mime_data = QMimeData() # 创建数据容器
        self.clipboard = QApplication.clipboard() #创建剪贴板对象


        self.layout.addWidget(self.text) # 向水平布局中添加文本对象
        self.widget = QWidget() # 创建一个窗口对象

        self.menu = self.menuBar() # 创建一个菜单对象
        self.file = self.menu.addMenu('文件') # 向菜单创建文件菜单栏
        self.new = QAction('新建(&N)') # 创建一个新建菜单功能
        self.new.setShortcut('Ctrl+N') # 为新建功能添加快捷键
        self.open = QAction('打开(&O)') # 创建一个打开的菜单功能
        self.open.setShortcut('Ctrl+O') # 为打开功能添加快捷键
        self.save = QAction('保存(&S)') # 创建一个保存的菜单功能
        self.save.setShortcut('Ctrl+S') # 为保存功能添加快捷键
        self.file.addActions([self.new,self.open,self.save]) # 将新建功能,打开功能,保存功能添加到文件这个菜单栏上
		
		# 下面的代码一样主要是创建一个编辑的菜单栏
        self.edit = self.menu.addMenu('编辑')
        self.copy = QAction('复制(&C)') # 复制
        self.copy.setShortcut('Ctrl+C')
        self.paste = QAction('粘贴(&V)') # 粘贴
        self.paste.setShortcut('Ctrl+V')
        self.edit.addActions([self.copy,self.paste]) # 将功能添加到编辑这个菜单栏中
		
		# 下面的代码一样主要是创建一个设置的菜单栏
        self.setting = self.menu.addMenu('设置')
        self.font = QAction('字体(&F)')
        self.color = QAction('颜色(&L)')
        self.setting.addActions([self.font,self.color])

    
        #设置布局
        self.widget.setLayout(self.layout) # 将水平布局设置到窗口中
        self.setCentralWidget(self.widget) # 将窗口水平居中
  1. QMenuBar 类的常用方法
方法 说明
addAction() 添加菜单项
addActions() 添加多个菜单项
addSeparator() 添加分割线
  1. QMenu 类的常用方法
方法 说明
addAction() 添加菜单项
addMenu() 添加菜单栏
addSeparator() 添加分割线
setTitle() 添加菜单
tiltle() 获取菜单的标题文本
  1. QAction 类的常用方法
方法 说明
setIcon() 设置菜单项图标
setconVisibleInMenu() 设置图标是否显示
setText() 添加菜单项文本
setIconText() 设置图标文本
setShortcut() 设置快捷键
setToolTip() 设置快捷键
setEnabled() 设置菜单项是否可用
text() 获取菜单项的文本

功能槽

def new_file(self):
        '''
        新建文件的函数
        '''
        if self.is_saved and self.text.toPlainText():# 判断文本是否保存了和文本框上是否有数据,如果保存了,文本框上有数据进行下面的语句
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) # 创建一个消息对话框,设置了三个选项yes,No,Cancel
            if choice == QMessageBox.Yes: # 如果选择yes
                self.save_file(self.text.toHtml()) # 保存文本框上的数据
                self.text.clear() # 清楚文本框上的数据
            elif choice == QMessageBox.No: # 如果选择No
                self.text.clear() # 清楚文本框上的数据
            else:
                pass
        else:
            self.text.clear() # 清楚文本框上的数据

    def open_file(self):
        '''
        打开文件的函数
        '''
        if self.is_saved:# 判断文件是否保存,若保存了,则进行下面的语句
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel) # 创建一个保存的消息对话框,设置了三个选项yes,No,Cancel
            if choice == QMessageBox.Yes: # 如果选择yes
                self.save_file(self.text.toHtml()) # 调用保存函数进行保存文本框上的数据
                file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)') #创建一个选择文件的对话框
                if file: # 若文件存在
                    with open(file, 'r',encoding='utf-8') as f: # 打开文件
                        self.text.clear() # 清楚文本框上的数据
                        self.text.setText(f.read()) # 将文件上的数据显示在文本框上
                        self.is_saved = True # 将保存标记设为True
            elif choice == QMessageBox.No: # 如果选择No,则是不想保存文本
                file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)') # 创建一个选择文件的对话框
                if file:
                    with open(file, 'r',encoding='utf-8') as f:
                        self.text.clear() # 清楚文本框上的数据
                        self.text.setText(f.read()) # 将文件上的数据显示在文本框上
                        self.is_saved = True # 将保存标记设为True
            else:
                pass
        else:
            file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)')# 创建一个选择文件的对话框
            
            if file:
                with open(file, 'r',encoding='utf-8') as f:
                    self.text.clear() # 清楚文本框上的数据
                    self.text.setText(f.read()) # 将文件上的数据显示在文本框上
                    self.is_saved = True # 将保存标记设为True

    def save_file(self,text):
        '''
        保存文件的函数
        '''
        path, a = QFileDialog.getSaveFileName(self, ' 保存文件', './', 'Files (*.html *.txt *.log)') # 创建一个保存的消息对话框,设置了三个选项yes,No,Cancel
        self.path = path # 保存的路径
        if self.path: # 如果路径存在,则进行下面的语句
            with open(self.path, 'w',encoding='utf-8') as f: # 打开文件
                f.write(text) # 将文本框上的数据写入文件中
            self.is_saved = True # 将保存标记设为True
        else:
            self.status_bar.showMessage('保存失败')

    def copy_file(self):
        '''
        复制文件的函数
        '''
        self.mime_data.setHtml(self.text.textCursor().selection().toHtml()) # 将文本框上的数据放进数据容器中
        self.clipboard.setMimeData(self.mime_data) # 将数据容器放进剪贴板上

    def paste_file(self):
        '''
        粘贴文件的函数
        '''
        self.text.insertHtml(self.clipboard.mimeData().html()) # 将剪贴板上的数据粘贴在文本框上

    def change_text(self):
        '''
        文本改变的函数
        '''
        if self.text.toPlainText(): # 文本发生改变了
            self.is_saved = False # 将保存标志设为 False
        else:
            pass

    def set_font(self):
        '''
        改变字体的函数
        '''
        font, ok = QFontDialog.getFont() # 创建一个字体对话框
        if ok:
            self.text.setFont(font) # 改变文本框上的字体

    def set_color(self):
        '''
        改变颜色的函数
        '''
        color = QColorDialog.getColor() # 创建颜色对话框
        if color.isValid(): # 判断颜色是存在
            self.text.setTextColor(color) # 改变文本的颜色

1.QTextEdit类常用方法

方法 说明
setPlainText() 设置文本内容
toPlainText() 获取文本内容
setTextColor() 设置文本内容
setTextBackgroundColor() 设置文本背景颜色
setHtml() 设置Html文本内容
toHtml() 获取Html文本内容
setWordWrapMode() 设置自动换行
clear() 清除所有内容
  1. QMimeData类
    拖放和剪贴板的功能原理基础都是QMimeData类。QMimeData类用来处理MIME类型数据。
    MIME是描述消息内容类型的因特网标准,可以简单理解为对文件扩展名的详细解释,通过该解释,程序就可以知道应该以何种方式处理该数据。每个MIME类型由两部分组成,前面是数据的大类别,后面定义具体的种类,例如扩展名为.png的MIME类型为image/png;而QMimeData则给记录自身MIME类型的数据提供了一个容器,用于专门处理MIME类型数据。
判断函数 获取函数 设置函数 MIME类型
hasText() text() setText() text/plain
hasHtml() html() setHtml() text/html
hasUrls() urls() setUrls() text/url-list
hasImage() imageData() setImageData() image/*
hasColor() colorData() setColorData() application/x-color
  1. QClipboard类常用方法
方法 说明
clear() 清空剪贴板内容
mimeData() 获取剪贴板上的MIME类型数据
setMimeData() 将MIME类型数据放到剪贴板中
pixmap() 获取剪贴板上的QPixmap类型数据
setPixmap() 将QPixmap类型数据放到剪贴板中
image() 获取剪贴板上的QImage类型数据
setImage() 将QImage类型数据放到剪贴板中
text() 获取剪贴板上的文本
setText() 将文本放到剪贴板中

其他

def variates_init(self):
        '''
        存变量的函数
        '''
        self.is_saved = False # 保存标志
        self.path = '' # 存储路径

    def connect_init(self):
        '''
        信号与槽连接的函数
        '''
        self.new.triggered.connect(self.new_file) #将新建功能菜单的信号链接在新建文件的槽(代码块)
        self.open.triggered.connect(self.open_file) #将打开功能菜单的信号链接在打开文件的槽(代码块)
        self.save.triggered.connect(lambda:self.save_file(self.text.toPlainText())) #将保存功能菜单的信号链接在保存文件的槽(代码块)
        self.copy.triggered.connect(self.copy_file) #将复制功能菜单的信号链接在复制文件的槽(代码块)
        self.paste.triggered.connect(self.paste_file) #将粘贴功能菜单的信号链接在粘贴文件的槽(代码块)
        self.text.textChanged.connect(self.change_text) # 将文本改变功能的信号链接在文本改变的槽(代码块)
        self.font.triggered.connect(self.set_font) #将字体功能菜单的信号链接在设置字体的槽(代码块)
        self.color.triggered.connect(self.set_color) #将颜色功能菜单的信号链接在设置颜色的槽(代码块)
        
    def closeEvent(self, event):
        '''
        关闭事件
        '''
        if not self.is_saved and self.text.toPlainText(): # 判断文本是否保存和文本框上是否有数据
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if choice == QMessageBox.Yes: # 选择yes
                self.save_file(self.text.toHtml()) # 保存文本框上的数据
                event.accept() # 接受退出事件,退出软件
            elif choice == QMessageBox.No: # 选择No
                event.accept() # 接受退出事件,退出软件
            else:
                event.ignore()# 忽略退出事件,不退出软件

全部代码

import sys
from PyQt5.QtCore import QMimeData
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QAction, QTextEdit, QMessageBox, QFileDialog, QFontDialog, QColorDialog


class notepad(QMainWindow):
    def __init__(self):
        super(notepad,self).__init__()
        self.ui_init()
        self.variates_init()
        self.connect_init()

    def ui_init(self):
        self.setWindowTitle('记事本')
        self.resize(700,400)
        self.text = QTextEdit()
        self.layout=QHBoxLayout()
        self.status_bar = self.statusBar()
        self.mime_data = QMimeData()
        self.clipboard = QApplication.clipboard()


        self.layout.addWidget(self.text)
        self.widget = QWidget()

        self.menu = self.menuBar()
        self.file = self.menu.addMenu('文件')
        self.new = QAction('新建(&N)')
        self.new.setShortcut('Ctrl+N')
        self.open = QAction('打开(&O)')
        self.open.setShortcut('Ctrl+O')
        self.save = QAction('保存(&S)')
        self.save.setShortcut('Ctrl+S')
        self.file.addActions([self.new,self.open,self.save]) # 添加动作到菜单上

        self.edit = self.menu.addMenu('编辑')
        self.copy = QAction('复制(&C)')
        self.copy.setShortcut('Ctrl+C')
        self.paste = QAction('粘贴(&V)')
        self.paste.setShortcut('Ctrl+V')
        self.edit.addActions([self.copy,self.paste])

        self.setting = self.menu.addMenu('设置')
        self.font = QAction('字体(&F)')
        self.color = QAction('颜色(&L)')
        self.setting.addActions([self.font,self.color])

    
        #设置布局
        self.widget.setLayout(self.layout)
        self.setCentralWidget(self.widget)

    def variates_init(self):
        '''
        存变量的函数
        '''
        self.is_saved = False
        self.path = ''

    def connect_init(self):
        '''
        信号与槽连接的函数
        '''
        self.new.triggered.connect(self.new_file)
        self.open.triggered.connect(self.open_file)
        self.save.triggered.connect(lambda:self.save_file(self.text.toPlainText()))
        self.copy.triggered.connect(self.copy_file)
        self.paste.triggered.connect(self.paste_file)
        self.text.textChanged.connect(self.change_text)
        self.font.triggered.connect(self.set_font)
        self.color.triggered.connect(self.set_color)

    def new_file(self):
        '''
        新建文件的函数
        '''
        if self.is_saved and self.text.toPlainText():
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if choice == QMessageBox.Yes:
                self.save_file(self.text.toHtml())
                self.text.clear()
            elif choice == QMessageBox.No:
                self.text.clear()
            else:
                pass
        else:
            self.text.clear()

    def open_file(self):
        '''
        打开文件的函数
        '''
        if self.is_saved:
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if choice == QMessageBox.Yes:
                self.save_file(self.text.toHtml())
                file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)')
                if file:
                    with open(file, 'r',encoding='utf-8') as f:
                        self.text.clear()
                        self.text.setText(f.read())
                        self.is_saved = True
            elif choice == QMessageBox.No:
                file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)')
                if file:
                    with open(file, 'r',encoding='utf-8') as f:
                        self.text.clear()
                        self.text.setText(f.read())
                        self.is_saved = True
            else:
                pass
        else:
            file, a = QFileDialog.getOpenFileName(self, '打开文件', './', 'Files (*.html *.txt *.log)')
            
            if file:
                with open(file, 'r',encoding='utf-8') as f:
                    self.text.clear()
                    content = f.read()
                    self.text.setText(content)
                    self.is_saved = True

    def save_file(self,text):
        '''
        保存文件的函数
        '''
        path, a = QFileDialog.getSaveFileName(self, ' 保存文件', './', 'Files (*.html *.txt *.log)')
        self.path = path
        if self.path:
            with open(self.path, 'w',encoding='utf-8') as f:
                f.write(text)
            self.is_saved = True
        else:
            self.status_bar.showMessage('保存失败')

    def copy_file(self):
        '''
        复制文件的函数
        '''
        self.mime_data.setHtml(self.text.textCursor().selection().toHtml())
        self.clipboard.setMimeData(self.mime_data)

    def paste_file(self):
        '''
        粘贴文件的函数
        '''
        self.text.insertHtml(self.clipboard.mimeData().html())

    def change_text(self):
        '''
        文本改变的函数
        '''
        if self.text.toPlainText():
            self.is_saved = False
        else:
            pass

    def set_font(self):
        '''
        改变字体的函数
        '''
        font, ok = QFontDialog.getFont()
        if ok:
            self.text.setFont(font)

    def set_color(self):
        '''
        改变颜色的函数
        '''
        color = QColorDialog.getColor()
        if color.isValid():
            self.text.setTextColor(color)
    
    def closeEvent(self, event):
        '''
        关闭事件
        '''
        if not self.is_saved and self.text.toPlainText():
            choice = QMessageBox.question(self, '保存文件', '你要保存文本吗?',QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
            if choice == QMessageBox.Yes:
                self.save_file(self.text.toHtml())
                event.accept()
            elif choice == QMessageBox.No:
                event.accept()
            else:
                event.ignore()
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    dispaly = notepad()
    dispaly.show()
    sys.exit(app.exec_())

成果展示

PyQt5项目:记事本_第1张图片
PyQt5项目:记事本_第2张图片
PyQt5项目:记事本_第3张图片
PyQt5项目:记事本_第4张图片

你可能感兴趣的:(PyQt5项目,qt,pyqt5,windows,python)