PyQt5入门教程
本文从最简单入门开始,介绍PyQt创建第一个桌面应用。示例采用Python3和PyQt5。
1. 创建应用
下面是最小化的PyQt应用,其甚至不包括窗口,如果运行该程序,说明都不会发生,但其仍在运行。
import sys
from PyQt5.QtWidgets import QApplication
# 每个应用仅需要一个 QApplication 实例.
# 传入sys.argv参数实现从命令行给应用传入参数.
# 如果确定无需从命令行传入参数,可以直接使用QApplication([]).
app = QApplication(sys.argv)
# 开始事件循环.
app.exec_()
# 在结束应用和事件循环停止之前,应用不会到达这里.
print("Finished")
逐行检查代码,首先从QtWidgets子模块导入PyQt5中QApplication类。然后创建QApplication实例,传入sys.arg(其包含命令行参数),通过该参数我们可以传入命令行参数给应用。如果确定不需要命令行参数,可以保持为空列表,如:
app = QApplication([])
最后调用app.exec_()启动事件循环。启动应用观察控制台,你会发现不会执行该print(“Finished”)语句,除非你结束应用。这时因为app.exec_()启动了事件循环使得程序阻塞等待事件。
如果需要在事件循环之前实现相关业务,需在该行代码之前。一般通过__init__方法进行初始化工作。
2. 创建窗体
上面示例很无聊,什么都看不到。下面给应用增加一个窗体,当然需要增加相应代码。下面示例实现一个最简单的单个窗体应用。
import sys
from PyQt5.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.show() # 重要提示!!!!! 窗体默认是隐藏的.
# Start the event loop.
app.exec_()
任何没有指明父对象(容器组件)的QWidget都是自己的窗体,这种方式可以创建窗体,但有专门的类QMainWindow实现窗体。其作为应用的主窗体包括工具栏、状态栏以及悬浮组件。下面使用QMainWindow重构代码:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
app = QApplication(sys.argv)
window = QMainWindow()
window.show() # IMPORTANT!!!!! Windows are hidden by default.
# Start the event loop.
app.exec_()
运行上面代码可以看到空窗体应用。
3. 增加控件
虽然有了窗体仍很无趣,下面我们继续并增加显示文本的控件QLabel,QMainWindow只能通过.setCentralWidget()方法容纳单个组件。如果需要增加更多组件并合理排列,需要使用Qt的布局。
import sys
from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow
from PyQt5.QtCore import Qt
# 创建QMainWindow的子类用于定制应用主窗体
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setWindowTitle("My Awesome App")
label = QLabel("This is a PyQt5 window!")
# `Qt` 命名空间有很多控件自定义属性
# 参考文档: http://doc.qt.io/qt-5/qt.html
label.setAlignment(Qt.AlignCenter)
# 设置Window的中心组件. 默认控件默认会扩展占满所有控件
self.setCentralWidget(label)
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec_()
运行程序应该看到窗体,但这次窗体中间多了QLabel控件,并且可以拖到边缘改变大小,代码中的对齐设置使得文本居中显示。
4. 总结
本文介绍PyQt5的入门程序,实际应用中一般会通过Qt Designer进行快速设计界面,同时又让界面代码和业务代码进行分离。
本文参考链接:https://blog.csdn.net/neweastsun/article/details/102004555