4. PyQt6入门:PyQt6安装与验证、QApplication与QWidget、信号与槽机制初探
好,咱们正式开始动手了。前面聊了那么多跨平台的理论,现在终于要碰一碰真正的代码。PyQt6 是我个人非常喜欢的一套工具,说白了,它就是 Qt 的 Python 绑定。你写 Python,它帮你调 C++ 的底层,效率高,还省心。
这一章,咱们把 PyQt6 的环境搭起来,跑通第一个窗口,再聊聊 PyQt6 里最核心的通信机制——信号与槽。嗯,这三件事搞定了,后面写界面就跟搭积木一样。
4.1 PyQt6 安装与验证
安装其实没什么难度。我建议你直接用 pip,干净利落。
pip install PyQt6
如果你用的是国内网络,加个镜像源会快很多。我个人习惯用清华的源:
pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simple
装完之后怎么验证?写两行代码跑一下就行。
import PyQt6.QtCore
print(PyQt6.QtCore.PYQT_VERSION_STR)
如果能打印出版本号,比如 6.5.0,那就说明装好了。我在项目中遇到过有人装成了 PyQt5,结果跑我的 demo 直接报错。所以,记得确认一下版本。
4.2 QApplication 与 QWidget
每个 PyQt6 程序,都需要一个 QApplication 对象。你可以把它理解成整个应用的“大管家”。它负责事件循环、全局设置、剪贴板管理等等。没有它,窗口就显示不出来。
而 QWidget,就是所有窗口组件的基类。按钮、标签、输入框,甚至整个窗口,本质上都是 QWidget 的子类。
来看一个最简单的例子:
import sys
from PyQt6.QtWidgets import QApplication, QWidget
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("我的第一个 PyQt6 窗口")
window.resize(400, 300)
window.show()
sys.exit(app.exec())
这段代码做了几件事:
- 创建 QApplication 实例,传入命令行参数
- 创建一个 QWidget 作为主窗口
- 设置标题和大小
- 调用
show()显示窗口 - 进入事件循环,直到用户关闭窗口
你想想看,如果没有 app.exec(),窗口会一闪而过。因为程序执行完就退出了。事件循环就是让程序“等”在那里,随时响应用户的操作。
sys.argv 传给 QApplication,这样以后如果需要处理命令行参数,就不用改代码了。
4.3 信号与槽机制初探
这是 PyQt6 的灵魂。信号与槽,说白了就是一种对象间的通信方式。一个对象发出信号,另一个对象的槽函数去响应。
举个例子,你点击一个按钮,按钮会发出 clicked 信号。你把这个信号连接到一个函数上,点击按钮时,那个函数就会自动执行。
为什么会这样?因为 Qt 的事件循环一直在监听各种事件。当鼠标点击发生时,Qt 把它包装成一个信号,然后通知所有连接了这个信号的槽函数。
看代码:
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QPushButton
def on_button_click():
print("按钮被点击了!")
app = QApplication(sys.argv)
window = QWidget()
window.setWindowTitle("信号与槽示例")
window.resize(300, 200)
button = QPushButton("点我", window)
button.setGeometry(100, 80, 100, 30)
button.clicked.connect(on_button_click)
window.show()
sys.exit(app.exec())
这里 button.clicked.connect(on_button_click) 就是连接信号与槽。点击按钮,控制台就会打印那句话。
嗯,这里要注意:槽函数不能加括号。你写 connect(on_button_click()) 的话,函数会在连接时立即执行,而不是点击时执行。我曾经在这个坑里栽过一次,调试了半天才发现。
4.4 知识体系总览
下面这张图,帮你把本章的核心逻辑串起来。从安装到第一个窗口,再到信号与槽,每一步都是环环相扣的。
4.5 避坑指南
最后,分享几个我踩过的坑:
- 窗口一闪而过:忘了调用
app.exec(),或者忘了sys.exit()。记住,事件循环是 GUI 程序的命脉。 - 信号连接没反应:检查槽函数名有没有拼错,或者是不是传了括号。我曾经把
connect(func)写成了connect(func()),结果函数在连接时就被调用了。 - 窗口显示不出来:确认 QApplication 是否在 QWidget 之前创建。顺序反了会报错。
嗯,这一章就到这里。代码不多,但都是基础中的基础。你可以在本地跑一跑,改改标题、改改按钮文字,感受一下 PyQt6 的实时反馈。动手永远是最好的学习方式。