PyQt5基础控件(上):窗口、标签、按钮与输入框
各位同学,今天咱们来聊聊PyQt5里最基础、也最常用的一批控件。说实话,这些控件就像盖房子的砖块,你早晚得跟它们打交道。我刚开始学PyQt5的时候,就是靠这几个控件搭出了第一个能用的桌面程序——虽然丑了点,但成就感满满。
QWidget与QMainWindow:窗口的两种姿态
先说说窗口。PyQt5里所有能显示的东西,几乎都继承自QWidget。你可以把它理解成「一块空白的画布」。而QMainWindow呢,是QWidget的升级版,自带菜单栏、工具栏、状态栏这些「标配」。
我个人习惯这样区分:
- QWidget:适合做弹窗、自定义小部件、或者简单的独立窗口
- QMainWindow:适合做主窗口,尤其是需要菜单栏和状态栏的应用
举个例子,你写个计算器,用QWidget就够了。但你要写个文本编辑器,那QMainWindow更合适——毕竟用户期望看到「文件」「编辑」这些菜单。
核心区别:QMainWindow有自己的一套布局管理,它不允许你直接设置中心部件以外的布局。说白了,你只能把主内容放到setCentralWidget()里,其他菜单栏、工具栏都是它帮你管。
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel
import sys
app = QApplication(sys.argv)
# 简单窗口
w = QWidget()
w.setWindowTitle('我是QWidget')
w.resize(300, 200)
w.show()
# 主窗口
mw = QMainWindow()
mw.setWindowTitle('我是QMainWindow')
central = QWidget()
mw.setCentralWidget(central)
label = QLabel('这是中心区域', central)
mw.statusBar().showMessage('就绪')
mw.show()
sys.exit(app.exec_())
嗯,这里要注意:QMainWindow如果不设置中心部件,直接往上面加控件会出问题。我曾经有个学生,折腾了半天控件显示不出来,最后发现是忘了setCentralWidget。
QLabel标签:不只是显示文字
QLabel,说白了就是用来显示文本或图片的。但你别小看它,它能干的事不少:
- 显示纯文本、富文本(HTML)
- 显示图片(QPixmap)
- 显示动画(QMovie)
- 作为链接(配合
setOpenExternalLinks)
我在项目中遇到过这样一个场景:需要显示一段带格式的说明文字,里面要有加粗、颜色、超链接。用QLabel配合HTML,一行代码搞定:
label = QLabel()
label.setText('<h2>欢迎</h2><p>点击 <a href="https://example.com">这里</a> 查看详情</p>')
label.setOpenExternalLinks(True) # 允许打开外部链接
小技巧:如果你想让QLabel自动换行,记得设置setWordWrap(True)。不然文字会一直往右跑,超出窗口边界。
QPushButton按钮:点击的反馈
按钮,应该是交互里最常用的控件了。QPushButton支持文本、图标、快捷键,还能设置默认按钮(按回车触发)。
你想想看,一个按钮最重要的就是点击后的反馈。PyQt5里用信号与槽机制:
from PyQt5.QtWidgets import QPushButton
btn = QPushButton('点击我')
btn.clicked.connect(lambda: print('按钮被点击了'))
我曾经犯过一个低级错误:在循环里创建按钮,然后全部连接到同一个槽函数,结果所有按钮点击都触发最后一个。后来才意识到,lambda表达式里要绑定当前循环变量,得用默认参数:
for i in range(5):
btn = QPushButton(f'按钮{i}')
btn.clicked.connect(lambda checked, x=i: print(f'点击了按钮{x}'))
避坑指南:我曾经在按钮的clicked信号里直接传参数,结果发现信号默认会传一个checked布尔值。如果你自定义槽函数,记得参数匹配,或者用lambda包装一下。
QLineEdit单行输入框:用户的文字入口
单行输入框,用来获取用户的一小段文本。比如用户名、密码、搜索关键词。常用的设置:
setEchoMode():密码模式用QLineEdit.PasswordsetPlaceholderText():占位提示文字setMaxLength():限制输入长度textChanged信号:实时监听输入变化
from PyQt5.QtWidgets import QLineEdit
line_edit = QLineEdit()
line_edit.setPlaceholderText('请输入用户名')
line_edit.setMaxLength(20)
line_edit.textChanged.connect(lambda text: print(f'当前输入:{text}'))
我个人习惯在表单验证时,用textChanged实时检查输入是否合法,而不是等用户点提交再报错。这样用户体验好很多。
QTextEdit多行文本框:富文本编辑器
QTextEdit比QLineEdit强大得多。它支持多行文本、富文本(HTML)、图片嵌入、甚至表格。你可以把它当成一个迷你版的Word。
常用的操作:
setPlainText():设置纯文本setHtml():设置富文本toPlainText():获取纯文本toHtml():获取HTML内容append():追加文本
from PyQt5.QtWidgets import QTextEdit
text_edit = QTextEdit()
text_edit.setHtml('<h1>标题</h1><p>这是<b>加粗</b>文字</p>')
text_edit.append('追加一行')
注意:QTextEdit默认支持富文本,如果你只想用纯文本,记得调用setAcceptRichText(False)。不然用户粘贴带格式的内容,可能会打乱你的布局。
我在做日志查看器时,就用QTextEdit来显示实时日志。配合append()方法,每来一条日志就追加一行,再配合moveCursor()自动滚动到底部,效果非常棒。
知识体系总览
下面这张图,帮你理清这几个控件的关系和用途:
这张图把今天讲的几个控件串起来了。你从上往下看:窗口基类分支出不同的窗口类型,然后每个窗口里都可以放这些基础控件。说白了,就是「窗口装控件」这么个结构。
好了,今天的内容就到这里。这几个控件虽然基础,但组合起来能做出很多实用的功能。你课后可以试着用QLineEdit和QPushButton做一个简单的登录界面,再用QTextEdit显示一些帮助信息。动手练练,比光看强得多。
可可精品资料库