1. 初识PyQt5
首先,Qt是一个全面的C++应用程序开发框架。它包含一个类库,和用于跨平台开发及国际化的工具。
PyQt5 就是用 Python 调用 Qt 来实现 GUI 工作的。
这个系列的博客都是根据《 Python Qt GUI 快速编程 》写的,这书…讲的是 PyQt4 的,翻译也有点问题。
2. 第一个例子
import sys, time
from PyQt5 import QtWidgets, QtCore
#每个 PyQt5对象必须有一个 QApplication 对象,并且传入启动参数。
app = QtWidgets.QApplication(sys.argv)
try:
due = QtCore.QTime()
message = "Alert!"
if len(sys.argv) < 2:
raise ValueError
hours, mins = sys.argv[1].split(':')
due = QtCore.QTime(int(hours), int(mins))
if not due.isValid():
raise ValueError
if len(sys.argv) > 2:
message = ' '.join(sys.argv[2:])
except ValueError:
message = 'Usage: alert.py HH:MM [optional message]' #24hr clock
while QtCore.QTime.currentTime() < due:
time.sleep(20) # 20 seconds
#QLabel 可以接受HTML对象并正确的渲染
label = QtWidgets.QLabel('<font color=red size=72><b>' + message + '</b></font>')
label.show()
#发送一次信号,参数为(time, action)
QtCore.QTimer.singleShot(60000, app.quit) # 1 minute
app.exec_()
代码解释:
QtWidgets:模块包含创造经典桌面风格的用户界面提供了一套UI元素的类。
QtCore:包含了核心的非GUI功能。此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程。
通过代码可以知道,我们通过QtWidgets来创建了一个Label元素,QtCore的作用正如解释那般。通过 QtWidgets.* 这样的用法可以使我们更加清晰这个模块的作用。
3. 面向对象的例子
import sys
from PyQt5 import QtWidgets
class Form(QtWidgets.QDialog):
def __init__(self):
super().__init__()
self.browser = QtWidgets.QTextBrowser()
self.line_edit = QtWidgets.QLineEdit()
#文本编辑控件,选中所有文本并聚焦,设置事件监听
self.line_edit.selectAll()
self.line_edit.setFocus()
self.line_edit.returnPressed.connect(self.update_ui)
#垂直布局,并将两个控价加入到布局中
layout = QtWidgets.QVBoxLayout()
layout.addWidget(self.browser)
layout.addWidget(self.line_edit)
#设置本窗体的布局
self.setLayout(layout)
self.setWindowTitle('Calculate')
def update_ui(self):
try:
expression = self.line_edit.text()
self.browser.append('%s = <b>%s</b>' % (expression, eval(expression)))
except:
self.browser.append('<font color=red>%s is invaild !</font>'%expression)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
form = Form()
form.show()
sys.exit(app.exec_())
代码解释:
eval( ),内置函数,计算表示式的值。
这里存在有事件监听(self.line_edit.returnPressed.connect(self.update_ui)
),但是在 PyQt5 中使用的是 Signal(信号) 和 Slot(槽)的术语。
Signal:控件监听的信号。
Slot:当某信号发生后调用的函数。
一个 Signal 可以绑定到多个 Slot 中,相反也是可以的。
4. 小结
- 每个 PyQt 应用必须有一个 QApplication 对象。
- QtWidgets 包含了所有的UI元素。
- Signal 和 Slot 的概念。
5 . 资源
官方文档,很详细,可以做参考,PyQt5 Reference Guide,里面没有什么例子,在这里找控件吧。
GitHub 上的教程
又一教程