PyQt5 入门(第二版)
万泽
2016 年 3 月 19 日
目 录
前言
第二版声明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
安装和配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
安装 pyqt5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
安装 pyqt4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
1
1
2
beginning
3
3
窗口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
加上图标 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
弹出提示信息 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
关闭窗体时询问 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
屏幕居中显示窗体 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
QMainWindow 类 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
加上状态栏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
加上菜单栏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
信号-槽机制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
如何查阅资料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
查看 pydoc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
相关网络资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
信号-槽详解
15
自定义信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
自定义槽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
发射信号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1
信号-槽机制的反思 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
使用 Qt designer
23
资源文件管理
23
资源管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
配置文件管理
24
QSettings 构造函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
IniFormat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ini 文件存放 DIY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ini 文件注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
存值和读值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
群组管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
布局管理
27
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
QBoxLayout
addStretch 方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
QGridLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
QFormLayout
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
快捷键和 Tab 键管理
32
什么是伙伴关系 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
快捷键 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
QKeySequence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
国际化支持
33
使用翻译文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
使用 qt 官方翻译文件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
附录
35
PyQt4 和 PyQt5 的区别整理 . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
引用信号发射对象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
菜单栏看不见? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
参考资料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2
前言
第二版声明
随着作者编程水平的上升,对很多内容都有了不同的理解。本文进行了进一步的重
新修改,推出第二版。
本文的例子都是基于 PyQt5。如果读者需要使用 PyQt4,请参看附录后面的 PyQt4
和 PyQt5 的区别整理一小节。
安装和配置
安装 pyqt5
就 ubuntu 下安装 pyqt5 是很简单的,如下所示:
sudo apt-get install python3-pyqt5
如果你使用的是默认的 python3 版本的话,否则你可能需要手工编译 pyqt5。
其中安装 Qt5 不需要我们多费心,请确保下面几个软件包安装上去了(参考了 这个
网页 和 这个网页 ):
sudo apt-get install qt5-default
sudo apt-get install qtbase5-dev
sudo apt-get install qtdeclarative5-dev
上面的第三个可能并不需要安装,其中第一个 qt5-default 和 qmake 的 v5 版本
有关,然后 qtbase5-dev 肯定是需要安装的。不管怎么说,确保这些都装上吧。
然后再在 PyQt 的官网 下载 SIP 的源码,运行 python3 configure.py 输出
makefile,后面就是大家熟悉的 make , sudo make install 。
继续再下载 PyQt5 的源码,安装步骤同上,这里就不赘述了。
在后面我们会提到 pyuic5 和 pyrcc5 命令,其在下面这个软件包里面:
3
sudo apt-get install pyqt5-dev-tools
检查 pyqt5 安装情况执行以下脚本即可,显示的是当前安装的 pyqt5 的版本号:
>>> from PyQt5.QtCore import QT_VERSION_STR
>>> print(QT_VERSION_STR)
5.2.1
本文的代码都是 PyQt 版本号都是上面的,没有特别的理由,会一直维持在这个版
本号里面了。
安装 pyqt4
安装 pyqt4 大致过程类似上面,只是一些细节上的改动了,比如:
ubuntu 下安装 pyqt4 即:
sudo apt-get install python3-pyqt4
如果你需要使用 qt designer 来辅助设计 GUI,你还需要额外安装 qt designer 软
件和 pyuic4 和 pyrcc4 命令。(顺便再次提醒下 pyrcc4 对中文目录目前支持有问题
(201410))
sudo apt-get install pyqt4-dev-tools qt4-designer
检查 pyqt4 安装情况执行以下脚本即可,显示的是当前安装的 pyqt4 的版本
号:
from PyQt4.QtCore import QT_VERSION_STR
print(QT_VERSION_STR)
4
beginning
窗口
请看到下面的代码:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.setGeometry(0, 0, 800, 600)
# 坐标 0 0 大小 800 600
self.setWindowTitle(’myapp’)
myapp = QApplication(sys.argv)
mywidget = MyWidget()
mywidget.show()
sys.exit(myapp.exec_())
首先导入 sys 宏包,这是为了后面接受 sys.argv 参数。关于引入这里值得一提的
是: 很多 pyqt4 原放在 QtGui 里面的一些 QWidget 在 pyqt5 里面都放入 QtWidgets
里面去了。
接下来我们定义了 MyWidget 类,它继承自 QWidget 类。然后通过 QWidget 类
的 setGeometry 方法来调整窗口的左顶点的坐标位置和窗口的大小。
然后通过 setWindowTitle 方法来设置这个窗口程序的标题,这里就简单设置
为”myapp” 了。
任何窗口程序都需要创建一个 QApplication 类的实例,这里是 myapp。然后接下
来创建 QWidget 类的实例 mywidget,然后通过调用 mywidget 的方法 show 来显示
窗体。
5
最后我们看到系统要退出是调用的 myapp 实例的 exec_ 方法。
加上图标
import sys
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QWidget, QApplication
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(800,600)
self.setWindowTitle(’myapp’)
self.setWindowIcon(QIcon\
(’icons/myapp.ico’))
myapp = QApplication(sys.argv)
mywidget = MyWidget()
mywidget.show()
sys.exit(myapp.exec_())
这个程序相对上面的程序就增加了一个 setWindowIcon 方法,这个方法调用了
QtGui.QIcon 方法,然后后面跟的就是图标的存放路径,使用相对路径。在运行这个例
子的时候,请随便弄个图标文件过来。
为了简单起见这个程序就使用了 QWidget 类的 resize 方法来设置窗体的大小。
弹出提示信息
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
6
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(800,600)
self.setWindowTitle(’myapp’)
self.setWindowIcon(QIcon\
(’icons/myapp.ico’))
self.setToolTip(’ 看什么看 ^_^’)
QToolTip.setFont(QFont\
(’ 微软雅黑’, 12))
myapp = QApplication(sys.argv)
mywidget = MyWidget()
mywidget.show()
sys.exit(myapp.exec_())
上面这段代码和前面的代码的不同就在于 MyWidget 类的初始函数新加入了两条命令。
其中 setToolTip 方法设置具体显示的弹出的提示文本内容,然后后面调用 QToolTip
类的 setFont 方法来设置字体和字号,我不太清楚这里随便设置系统的字体微软雅黑是
不是有效。
这样你的鼠标停放在窗口上一会儿会弹出一小段提示文字。
关闭窗体时询问
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWidget(QWidget):
def __init__(self):
super().__init__()
self.resize(800,600)
self.setWindowTitle(’myapp’)
7
self.setWindowIcon(QIcon\
(’icons/myapp.ico’))
self.setToolTip(’ 看什么看 ^_^’)
QToolTip.setFont(QFont\
(’ 微软雅黑’, 12))
def closeEvent(self, event):
# 重新定义 colseEvent
reply = QMessageBox.question\
(self, ’ 信息’,
” 你确定要退出吗?”,
QMessageBox.Yes,
QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
myapp = QApplication(sys.argv)
mywidget = MyWidget()
mywidget.show()
sys.exit(myapp.exec_())
这段代码和前面代码的不同就是重新定义了 colseEvent 事件。这段代码的核
心 就 是 QtGui 类 的 QMessageBox 类 的 question 方法, 这 个 方 法 将 会 弹 出 一 个
询问窗体。这个方法接受四个参数:第一个参数是这个窗体所属的母体,这里就是
self 也就是实例 mywidget;第二个参数是弹出窗体的标题;第三个参数是一个标准
button;第四个参数也是一个标准 button,是默认(也就是按 enter 直接选定的)的
button。然后这个方法返回的是那个被点击了的标准 button 的标识符,所以后面和标
准 QMessageBox.Yes 比较了,然后执行 event 的 accept 方法。
屏幕居中显示窗体
8