PyQt5中常用控件主要包含五种,分别是文本类控件、按钮类控件、选择列表类控件、容器控件、日期时间类控件。这五类控件在开发UI程序时占着举足轻重的地位,掌握的熟练程度决定着我们开发时的效率。本文旨在帮助初学者能够更好的掌握各个控件的使用方法,同时页希望成为一个加强记忆的工具。
本文中使用Qt Designer结合PyCharm示例。
文本类控件
主要包含Label(标签)、LineEdit(单行文本框)、TextEdit(多行文本框)、SpinBox(整数数字选择件)、DoubleBox(小数数字选择器)、LCDNumber(液晶数字选择器)。接下来我们一一讲解每一个控件的使用方法。
1.Label
主要作用是显示用不能编辑的文本、标识窗体上的对象等(例如给文本框添加描述信息),它对应于PyQt5中的QLabel类。
label常用方法如下所示
setAlignment() | 设置文本的对其方式 |
---|---|
setWordWrap() | 设置文本是否换行True/False |
setText() | 为label设置文本内容 |
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setWordWrap(True)
self.label.setText("床前明月光,疑是地上霜")
运行结果如下所示:
左侧图像为使用setWordWrap属性,实现了换行功能,如果不适用该功能的话结果如右侧图像所示。
2.LineEdit
单行文本框,该控件只能输入单行字符串(可以在开发登录界面时使用它),对应于QLineEdit类。
常用方法如下所示:
setText() | 设置文本框内容 |
---|---|
text() | 获得文本框内容 |
setEchoMode() | 设置文本框显示字符的模式self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password) |
QLineEdit.Normal:正常显示输入的字符(默认设置) | |
QLineEdit.NoEcho:不显示任何输入的字符,设用于即使符合密码长度也需要保密的密码 | |
QLineEdit.Password:输入密码时显示掩码 | |
QLineEdit.PasswordEchoOnEdit:在编辑时显示字符,失去焦点后显示密码掩码 | |
setValidator() | 设置文本框验证器self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999)) |
QIntValidator:限制输入整数 | |
QDoubleValidator:限制输入小数/QRegExpValidator:检查输入是否符合设置的正则表达式 |
常用信号 | |
---|---|
textChanged | 当更改文本框中的内容时发射该信号 |
editingFinished | 当文本框中的内容编辑结束时发射该信号,《enter》键为结束标志 |
举例如下:通过label与lineEdit设计如下界面,使得用户名只能输入数字,输入密码时只显示掩码。
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(250, 190, 120, 30))
self.lineEdit.setObjectName("lineEdit")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(250, 240, 120, 30))
self.lineEdit_2.setObjectName("lineEdit_2")
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))
在lineEdit_2中对输入结果做了要求:设置文本框为密码且变成掩码,同时设置只能输入8位数字。
lineEdit有两个槽函数,使用方法相同,现举例如下:
如果不清楚信号-槽这个代码在哪写,请在评论区提问(默认都会)
# 这个函数的作用是:当在lineEdit输入CSDNer后按下enter,文本便会出现在下方的label_3中
def get_text(self):
self.label_3.setText(self.lineEdit.text())
<->
两个信号的区别:textChanged:lineEdit的内容发生改变时,对应的label_3的内容也随之改变;
editingFinshed则要等到按下enter后才会改变。
3.TextEdit
多行文本框,对应于QTextEdit类。当文本超出控件的显示范围时,该控件自动显示滚动条。
setPlainText() | 设置文本内容 |
---|---|
setTextColor() | 设置文本颜色self.textEdit.setTextColor(QtCore.Qt.red) |
setWordWrapMode() | 设置自动换行 |
clear() | 清空所有内容(可以编写槽函数) |
self.textEdit.setText("你好,世界!你好,世界!你好,世界!你好,世界!你好,世界!"
"你好,世界!你好,世界!你好,世界!你好,世界!你好,世界!你好,世界!你好,世界!")
4.SpinBox/DoubleBox
二者分别对应QSpinBox类与QDoubleBox类。既可以单击箭头选择数字也可以自己输入数字。
spinBox常见方法:
1.setValue() | 设置空间的当前值 |
---|---|
2.setMaximum()/setMinimum() | 设置最大/最小值 |
3.setRange() | 设置范围,通用性较强 |
4.setSingleStep() | 设置步长 |
5.value() | 获取控件的值 |
常见信号:可以通过valueChange获取控件当前值
doubleBox常见方法同上
示例如下:
我们先按照下图搭建UI。左位spinBox控件,又位doubleBox控件;下面两个label用于构建槽函数的展示。
self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox.setGeometry(QtCore.QRect(100, 200, 151, 81))
self.spinBox.setObjectName("spinBox")
self.spinBox.setRange(0, 100) # 设置范围
self.spinBox.setSingleStep(5) # 设置步长(同下)
self.doubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget)
self.doubleSpinBox.setGeometry(QtCore.QRect(310, 200, 151, 81))
self.doubleSpinBox.setObjectName("doubleSpinBox")
self.doubleSpinBox.setRange(0, 100)
self.doubleSpinBox.setSingleStep(0.5)
# 连接信号与槽
self.spinBox.valueChanged.connect(self.get_spin_num)
self.doubleSpinBox.valueChanged.connect(self.get_double_num)
# 槽函数
def get_spin_num(self):
self.label.setText(str(self.spinBox.value()))
def get_double_num(self):
self.label_2.setText(str(self.doubleSpinBox.value()))
与初始图片相比较。两个控件包括两个label的内容都发生了变化。
5.LCDNumber
该控件主要用来显示液晶数字,对应与QLCDNumber类
常用方法如下所示:
setDigitCount() | 设置可以显示的数字数量 |
---|---|
setMode(QtWidgets.QLCDNumber.Dec) | 设置显示数字的模式,举例为十进制 |
setSegmentStyle(QtWidgets.QLCDNumber.Flat) | 设置显示样式 |
value() | 获取值 |
setProperty() | 设置相应属性的值 |
同样,先搭建如下图所示:当在lineEdit输入数字时,lcdNumber随之显示。
self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
self.lcdNumber.setGeometry(QtCore.QRect(100, 300, 300, 200))
self.lcdNumber.setObjectName("lcdNumber")
def set_value(self):
self.lcdNumber.setProperty("value", self.lineEdit.text())
结果如下所示:
文本类控件现已完结,欢迎大佬批评指正。