PyQt5中文教程: maicss.gitbooks.io/pyqt5/conte…
一、PyQt5简介
PyQt5 是Digia的一套Qt5与python绑定的应用框架,同时支持2.x 和3.x,Qt库由Riverbank Computing开发, 是最强大的GUI库之一
PyQt5是由一系列Python模块组成。超过620个类,6000和函数和方法
PyQt5类分为很多模块,主要模块有:
-
QtCore 包含了核心的非GUI的功能。主要和时间、文件与文件 夹、各种数据、流、URLs、mime类文件、进程与线程一起使用
-
QtGui 包含了窗口系统、事件处理、2D图像、基本绘画、字体和 文字类
QtWidgets类包含了一系列创建桌面应用的UI元素
QtMultimedia包含了处理多媒体的内容和调用摄像头API的类
QtBluetooth模块包含了查找和连接蓝牙的类
QtNetwork包含了网络编程的类,这些工具能让TCP/IP和UDP开发变得更加方便和可靠
QtPositioning包含了定位的类,可以使用卫星、WiFi甚至文本
Engine包含了通过客户端进入和管理Qt Cloud的类
QtWebSockets包含了WebSocket协议的类
QtWebKit包含了一个基WebKit2的web浏览器
QtWebKitWidgets包含了基于QtWidgets的WebKit1的类
QtXml包含了处理xml的类,提供了SAX和DOM API的工具
QtSvg提供了显示SVG内容的类,Scalable Vector Graphics (SVG)是一种是一种基于可扩展标记语言(XML),用于描述二维矢量 图形的图形格式(这句话来自于维基百科)
QtSql提供了处理数据库的工具
QtTest提供了测试PyQt5应用的工具
二、PyQt4和PyQt5的区别
PyQt5不兼容PyQt4,PyQt5有一些巨大的改进。但是,迁移并不是很难,两者的区别如下:
-
重新组合模块,一些模块已经被废弃(QtScript),有些被分为两个子模块(QtGui, QtWebKit)
-
添加了新的模块,比如QtBluetooth, QtPositioning,和 Enginio
-
废弃了SINGAL()和SLOT()的调用方式,使用了新的信号和xx处 理方式
-
不再支持所有被标记为废弃的或不建议使用的QtAPI
三、PyQt5基本的功能
1、简单的窗口
代码实现:
import sys # 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器强烈交互的函数
from PyQt5.QtWidgets import QApplication, QWidget # 导入基本的组件模块
"""
sys.argv:是一组命令行参数的列表
QWidge控件:是一个用户界面的基本控件,它提供了基本的应用构造器
默认情况下,构造器是没有父级的,没有父级的构造器被称为窗口 (window)
resize():方法能改变控件的大小,这里的意思是窗口宽250px,高 150px
move():是修改控件位置的的方法。它把控件放置到屏幕坐标的(300, 300)的位置。注:屏幕坐标系的原点是屏幕的左上角
exit():结束主循环
sys.exit():能确保主循环安全退出
exec_() :之所以有个下划线,是因为 exec 是一个Python的关键字
"""
if __name__ == '__main__':
app = QApplication(sys.argv) # 创建一个应用对象,sys.argv是一组命令行参数的列表
w = QWidget() # QWidge控件是一个用户界面的基本控件,它提供了基本的应用构造器
w.resize(250, 150)
w.move(300, 300)
w.setWindowTitle('Simple') # 给这个窗口添加了一个标题,标题在标题栏展示
w.show() # 让控件在桌面上显示出来
sys.exit(app.exec_())
2、带窗口图标
窗口图标通常是显示在窗口的左上角,标题栏的最左边
前一个例子是使用的过程式编程 ,Python还支持面向对象的编程
代码实现:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
"""
setGeometry() :有两个作用,把窗口放到屏幕上并且设置窗口大小
参数分别代表屏幕坐标的x、y和窗 口大小的宽、高。
也就是说这个方法是 resize() 和 move() 的合体
"""
# 创建构造器类,并继承构造器
class Example(QWidget):
# 调用本身的构造器的一个方法
def __init__(self):
# 调用继承的构造器
super().__init__()
# 调用initUI方法
self.initUI()
# 创建一个GUI
def initUI(self):
self.setGeometry(300, 300, 300, 220)
# 添加标题
self.setWindowTitle('Icon')
# 添加图标
self.setWindowIcon(QIcon('default.png'))
# 展示
self.show()
if __name__ == '__main__':
# 创建一个应用对象
app = QApplication(sys.argv)
# 创建构造器
ex = Example()
# 结束主循环
sys.exit(app.exec_())
程序预览:
3、提示框
代码实现:
import sys
from PyQt5.QtWidgets import (QWidget, QToolTip, QPushButton, QApplication)
from PyQt5.QtGui import QFont
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建一个提示框,10px的SansSerif字体
QToolTip.setFont(QFont('SansSerif', 10))
# 设置了提示框的字体
self.setToolTip('This is a <b>QWidget</b> widget')
# 调用 setTooltip() 创建提示框可以使用富文本格式的内容
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
# 创建一个按钮,为按钮添加了一个提示框
btn.resize(btn.sizeHint())
btn.move(50, 50)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('Tooltips')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序预览:
4、关闭窗口
关闭一个窗口最直观的方式就是点击标题栏的那个叉,这个例子里,我们展示的是如何用程序关闭一个窗口。这里我们将接触到一点single 和slots的知识,事件传递系统在PyQt5内建的single和slot机制里面
代码实现:
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from PyQt5.QtCore import QCoreApplication # 导入QtCore对象
class Example(QWidget):
def __init__(self):
super().__init__()
self.intUI()
def intUI(self):
# 创建一个按钮
qbtn = QPushButton('Quit', self)
# 点击事件,QCoreApplication删除事件,instance() 创建了一个它的实 例
qbtn.clicked.connect(QCoreApplication.instance().quit)
qbtn.resize(qbtn.sizeHint())
qbtn.move(50, 50)
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Quit button')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
程序预览:
5、消息盒子
默认情况下,我们点击标题栏的×按钮,QWidget就会关闭。但是有时 候,我们修改默认行为。比如,如果我们打开的是一个文本编辑器,并 且做了一些修改,我们就会想在关闭按钮的时候让用户进一步确认操作
如果关闭QWidget,就会产生一个QCloseEvent。改变控件的默认行 为,就是替换掉默认的事件处理
代码实现:
import sys
from PyQt5.QtWidgets import QWidget, QMessageBox, QApplication
"""
question:第一个参数显示在消息框的标题栏,
第二个参数显示在对话框,
第三个参数是消息框的俩按钮,最后一个参数是默认按钮,
这个按钮是默认选中的。返回值在变量 reply 里
"""
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setGeometry(300, 300, 250, 150)
self.setWindowTitle('Message box')
self.show()
# 创建一个关闭事件的方法
def closeEvent(self, event):
# 创建一个消息框
reply = QMessageBox.question(self, 'Message',
"Are you sure to quit?",
QMessageBox.Yes |
QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
这里判断返回值,如果点击的是Yes按钮,我们就关闭组件和应用,否者就忽略关闭事件
程序预览:
6、窗口居中
窗口在屏幕上居中显示
代码实现:
import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication
"""
QtGui.QDesktopWidget :提供了用户的桌面信息,包括屏幕的大小
"""
class Example(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.resize(250, 150)
# 调用居中的方法
self.center()
self.setWindowTitle('Center')
self.show()
def center(self):
# 获取主窗口的大小
qr = self.frameGeometry()
# 获取显示器的分辨率,然后得到中间点的位置
cp = QDesktopWidget().availableGeometry().center()
# 把自己窗口的中心点放置到qr的中心点
qr.moveCenter(cp)
# 把窗口的坐上角的坐标设置为qr的矩形左上角的坐标
self.move(qr.topLeft())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())