鱼C论坛

 找回密码
 立即注册
查看: 3759|回复: 2

[技术交流] PyQT5急速入门3

[复制链接]
发表于 2016-4-19 21:12:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
原文链接

上一篇 -> PyQT5急速入门2

引言

这篇文章是前作的续篇(part 3), 为了达到最好的教学效果, 请务必先阅读前作.

在这篇续作当中, 我们将要开发一个简易文本阅读器, 简单起见, 这个阅读器只能阅读文本文档的内容, 但是, 只需要经过一些简单的修改就能成为一个全能的编辑器啦.

代码

  1. import sys
  2. import os
  3. from PyQt5.QtCore import *
  4. from PyQt5.QtWidgets import *

  5. class Notepad(QMainWindow):
  6.     def __init__(self):
  7.         super(Notepad, self).__init__()
  8.         self.initUI()

  9.     def initUI(self):        
  10.         openAction = QAction('Open', self)
  11.         openAction.setShortcut('Ctrl+O')
  12.         openAction.setStatusTip('Open a file')
  13.         openAction.triggered.connect(self.openFile)

  14.         closeAction = QAction('Close', self)
  15.         closeAction.setShortcut('Ctrl+Q')
  16.         closeAction.setStatusTip('Close Notepad')
  17.         closeAction.triggered.connect(self.close)

  18.         menubar = self.menuBar()
  19.         fileMenu = menubar.addMenu('&File')
  20.         fileMenu.addAction(openAction)        
  21.         fileMenu.addAction(closeAction)

  22.         self.textEdit = QTextEdit(self)
  23.         self.textEdit.setFocus()
  24.         self.textEdit.setReadOnly(True)

  25.         self.resize(700, 800)
  26.         self.setWindowTitle('Notepad')
  27.         self.setCentralWidget(self.textEdit)
  28.         self.show()

  29.     def openFile(self):
  30.         filename, _ = QFileDialog.getOpenFileName(self, 'Open File', os.getenv('HOME'))

  31.         fh = ''

  32.         if QFile.exists(filename):
  33.             fh = QFile(filename)

  34.         if not fh.open(QFile.ReadOnly):
  35.             QtGui.qApp.quit()

  36.         data = fh.readAll()
  37.         codec = QTextCodec.codecForUtfText(data)
  38.         unistr = codec.toUnicode(data)

  39.         tmp = ('Notepad: %s' % filename)
  40.         self.setWindowTitle(tmp)

  41.         self.textEdit.setText(unistr)

  42. def main():
  43.     app = QApplication(sys.argv)
  44.     notepad = Notepad()
  45.     sys.exit(app.exec_())

  46. if __name__ == '__main__':
  47.     main()
复制代码


代码分析

其实你应该能看懂绝大部分的代码, 我们定义的类继承与 QMainWindow 这个基类, 这样可以让我们把菜单栏放置到窗体的顶部.

01.png

12-15行: 使用信号和槽来让对象互相之间进行通讯, 这是Qt众多核心特征之一, 当一个事件发生的时候, 将会发出一个信号, 而槽则是Python里面的可调用的对象, 如果一个信号和一个槽相连接的话, 这个槽所指的对象将会在收到信号的时候被调用, 反之亦然.

当按下 Open 的时候, 相当于给 openFile 这个对象发出了调用信号, 同样的, 通过键盘快捷键来完成这一事件同样在代码中定义了.

22-25行: 定义了一个菜单组件, 并且给这个菜单组件添加了两个动作, 这样一来, 用户将会看到一个 File 菜单, 快捷键是 Alt+F, 当其被点击的时候, 将会出现含有两个选项的菜单.

第37行: 弹出一个浏览文件的对话框, 其中第二个参数是浏览文件对话框的标题内容, 第三个参数则是默认打开的目录, 这个目录默认是这个代码所在目录.

41-42行: 检测这个文件是否存在, 如果存在则把其赋值给fh这个变量.

44-45行: 尝试打开这个文件, 如果打开失败则退出程序.

47-49行: 把这个文件对象里面的内容全部读取出来, 然后尝试设置文件编码, 我们最先尝试Unicode编码, 如果失败了则使用Latin-1编码.

51-52行: 把窗体的标题改为文件路径, 并在前面加上 ‘Notepad’ .

总结

我在底部留了一个状态栏的坑, 欢迎大家前来填坑~

希望你能喜欢这篇文章 :-)

评分

参与人数 1荣誉 +10 鱼币 +10 贡献 +10 收起 理由
冬雪雪冬 + 10 + 10 + 10 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-23 17:17:13 | 显示全部楼层
我一直觉得如果可以把qt自带的库裁剪得小一些的话pyqt就完美了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-10 11:40:48 | 显示全部楼层
6666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 14:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表