简介
根据 《快速掌握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)
- QMenuBar 类的常用方法
方法 |
说明 |
addAction() |
添加菜单项 |
addActions() |
添加多个菜单项 |
addSeparator() |
添加分割线 |
- QMenu 类的常用方法
方法 |
说明 |
addAction() |
添加菜单项 |
addMenu() |
添加菜单栏 |
addSeparator() |
添加分割线 |
setTitle() |
添加菜单 |
tiltle() |
获取菜单的标题文本 |
- 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)
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()
self.text.setText(f.read())
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)
1.QTextEdit类常用方法
方法 |
说明 |
setPlainText() |
设置文本内容 |
toPlainText() |
获取文本内容 |
setTextColor() |
设置文本内容 |
setTextBackgroundColor() |
设置文本背景颜色 |
setHtml() |
设置Html文本内容 |
toHtml() |
获取Html文本内容 |
setWordWrapMode() |
设置自动换行 |
clear() |
清除所有内容 |
- 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 |
- 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:
self.save_file(self.text.toHtml())
event.accept()
elif choice == QMessageBox.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_())
成果展示



