PyQt5学习笔记(一)

时间:2022-04-22 08:35:26

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_())    

PyQt5学习笔记(一)
代码解释:
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 上的教程
又一教程