10 PyQt5步长调节器
10 PyQt5步长调节器
PyQt5步长调节器属于一种组合控件,严格的来说也属于输入控件的一部分,主要包含整型步长调节器(QSpinBox)、浮点型步长调节器(QDoubleSpinBox)、时间调节器(QDateTimeEdit)、下拉框(QComboBox)、字体选择框(QFontComboBox)、刻度控件(QSlider)、滚动条控件(QScrollBar)、旋转按钮控件(QDial)、橡皮筋控件(QRubberBand)等。1 QAbstractSpinBox步长调节器基类
QAbstractSpinBox是我们接下来要学的步长调节器的基类,这个也是一个抽象类,不能直接实例化,在使用QAbstractSpinBox之前先要子类化,或者直接使用子类来创建对象。QAbstractSpinBox中有很多常用的方法,我们遵循一贯的学习顺序,先从它开始。# 三种步长调节器:整形、浮点型、时间
# QSpinBox
# QDoubleSpinBox
# QDateTimeEdit
self.asb = QAbstractSpinBox(self)
self.asb.resize(100,30)
self.asb.move(100,50)

QAbstractSpinBox是一个抽象类,需要子类化它,才能实现它的功能。步长调节器是一个组合控件。
子类化QAbstractSpinBox,实现0-9之间调节。class Sub_Abs(QAbstractSpinBox):
def __init__(self,*args, **kwargs):
super().__init__(*args, **kwargs)
self.lineEdit().setText('0') # 设置一个默认值,作为容错
def stepEnabled(self):
# 取出内部值
num = int(self.text())
if num == 0:
print("只能向上调节")
return QAbstractSpinBox.StepUpEnabled # 表示只能向上调节
elif num == 9:
print("只能向下调节")
return QAbstractSpinBox.StepDownEnabled # 表示只能向下调节
elif 0 < num < 9:
print("0-9之间")
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
else:
return QAbstractSpinBox.StepNone
# 设置步长
def stepBy(self, steps):
num = int(self.text()) + steps*2
self.lineEdit().setText(str(num))
长按累加加速功能
self.asb.setAccelerated(True)
只读设置
self.asb.setReadOnly(True)
设置上下键样式
# 设置上下键样式
# QAbstractSpinBox.NoButtons
# QAbstractSpinBox.UpDownArrows 键盘上下键控制
# QAbstractSpinBox.PlusMinus
self.asb.setButtonSymbols(QAbstractSpinBox.UpDownArrows)
self.asb.setButtonSymbols(QAbstractSpinBox.UpDownArrows)
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import sys
class Sub_Abs(QAbstractSpinBox):
def __init__(self,*args, **kwargs):
super().__init__(*args, **kwargs)
self.lineEdit().setText('0') # 设置一个默认值,作为容错
def stepEnabled(self):
# 取出内部值
num = int(self.text())
if num == 0:
print("只能向上调节")
return QAbstractSpinBox.StepUpEnabled # 表示只能向上调节
elif num == 9:
print("只能向下调节")
return QAbstractSpinBox.StepDownEnabled # 表示只能向下调节
elif 0 < num < 9:
print("0-9之间")
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
else:
return QAbstractSpinBox.StepNone
pass
# 设置步长
def stepBy(self, steps):
num = int(self.text())
if num + steps*2 > 9 :
pass
else:
self.lineEdit().setText(str(num + steps*2))
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QAbstractSpinBox步长调节器抽象基类")
self.resize(600, 500)
self.func_list()
def func_list(self):
self.func()
def func(self):
# 三种步长调节器:整形、浮点型、时间
# QSpinBox
# QDoubleSpinBox
# QDateTimeEdit
self.asb = Sub_Abs(self)
self.asb.resize(100,30)
self.asb.move(100,50)
# 长按累加加速功能
self.asb.setAccelerated(True)
# 只读设置
# self.asb.setReadOnly(True)
# 设置和获取文本框内容
self.btn = QPushButton(self)
self.btn.move(200,100)
self.btn.setText("按 钮")
self.btn.pressed.connect(self.pre_btn)
def pre_btn(self):
print(self.asb.text())
# self.asb.lineEdit().setText("555")
# 设置对齐方式
self.asb.setAlignment(Qt.AlignRight) # 设置右对齐
# 设置周边框架
self.asb.setFrame(True)
#清空文本框内推
# self.asb.clear()
# 设置上下键模式
# QAbstractSpinBox.NoButtons
# QAbstractSpinBox.UpDownArrows
# QAbstractSpinBox.PlusMinus
self.asb.setButtonSymbols(QAbstractSpinBox.PlusMinus)
# 可用信号
self.asb.editingFinished.connect(lambda : print(123))
pass
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
2 QSpinBox整型步长调节器
QSpinBox整型步长调节器顾名思义就是用来调节整型数据的,本节课主要讲解QSpinBox的一些常用的API方法,主要有步长范围,数字循环、前缀后缀、设置和获取值的方法等。
QspinBox 默认范围是0-99。
修改默认范围:
self.qsb.setMaximum(199)
self.qsb.setMinimum(-15)
self.qsb.setRange(-15, 199)
设置数值循环:
self.qsb.setWrapping(True)
# 设置步长
self.qsb.setSingleStep(5)
设置前缀和后缀
self.qsb.setPrefix('元')
self.qsb.setSuffix('月')
代码以及注释:
from PyQt5.Qt import *
import sys
class Qsb(QSpinBox):
def textFromValue(self, val):
return (str(val) + '*' + str(val))
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QSpinBox-处理整形数据的步长调节器 - PyQt5中文网")
self.resize(600, 500)
self.func_list()
def func_list(self):
self.func()
def func(self):
self.qsb = Qsb(self) # 直接构造范围是0-99
self.qsb.resize(100, 30)
self.qsb.move(150, 150)
self.btn = QPushButton('按钮', self)
self.btn.resize(60, 30)
self.btn.move(150, 200)
self.btn.pressed.connect(self.test)
def test(self):
'''
# 修改最大值
self.qsb.setMaximum(199)
self.qsb.setMinimum(-15)
print(self.qsb.minimum())
self.qsb.setRange(-15,199)
# 数值循环
self.qsb.setWrapping(True)
# 设置步长
self.qsb.setSingleStep(5)
# 设置前缀和后缀
# self.qsb.setPrefix('元')
# self.qsb.setSuffix('月')
self.qsb.setRange(0,6)
self.qsb.setPrefix('周')
self.qsb.setSpecialValueText('周日') # 设置最小值字符串
# 显示数值进制
self.qsb.setDisplayIntegerBase(2) # 设置成二进制
# 获取或设置文本框数值
# self.qsb.setRange(1,25) # 这里设置之后下面数值设置超过范围内则显示这里的最大值
self.qsb.setValue(50)
print(self.qsb.value()) # 只能拿到数值
print(self.qsb.text()) # 能拿到数值和前缀
print(self.qsb.lineEdit().text()) # 能拿到数值和前缀
'''
# 自定义展示格式,重写方法,在上面Qsb中
# 可用信号
self.qsb.valueChanged[int].connect(lambda val: print(type(val)))
self.qsb.valueChanged[str].connect(lambda val: print(type(val)))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
3 QDoubleSpinBox浮点型步长调节器
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QDoubleSpinBox-处理浮点型步长调节器 - PyQt5中文网")
self.resize(600, 500)
self.func_list()
def func_list(self):
self.func()
def func(self):
self.qsb = QDoubleSpinBox(self) # 直接构造范围是0-99.99,步长为1.0
self.qsb.resize(100, 30)
self.qsb.move(150, 150)
self.btn = QPushButton('按钮', self)
self.btn.resize(60, 30)
self.btn.move(150, 200)
self.btn.pressed.connect(self.test)
def test(self):
# 修改最大值
self.qsb.setMaximum(9.99)
self.qsb.setMinimum(-5.2)
print(self.qsb.minimum())
self.qsb.setRange(-5.2, 9.99)
# 数值循环
self.qsb.setWrapping(True)
# 设置步长
self.qsb.setSingleStep(0.07)
# 设置前缀和后缀
self.qsb.setPrefix('%')
self.qsb.setSuffix('$')
# self.qsb.setRange(0.5,5.5)
# self.qsb.setPrefix('周')
# self.qsb.setSpecialValueText('周日') # 设置最小值字符串
# 小数位数设置
self.qsb.setDecimals(1)
# 获取或设置文本框数值
# self.qsb.setRange(1,25) # 这里设置之后下面数值设置超过范围内则显示这里的最大值
self.qsb.setValue(50)
print(self.qsb.value()) # 只能拿到数值
print(self.qsb.cleanText()) # 获取文本字符串,不包括前后缀和空格
print(self.qsb.text()) # 能拿到数值和前缀
print(self.qsb.lineEdit().text()) # 能拿到数值和前缀
# 自定义展示格式,重写方法,在上面Qsb中
# 可用信号
self.qsb.valueChanged[float].connect(lambda val: print(type(val)))
self.qsb.valueChanged[str].connect(lambda val: print(type(val)))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
4 QDateTimeEdit时间日期调节器
QDateTimeEdit时间日期调节器和之前学过的两种调节器有很多不一样的地方,但是也有很多共同点,在使用的时候主要是看你使用哪种构造方法,然后给予对应的设置。在后面对话框中我们还需要学习另一种时间日期对话框,和QDateTimeEdit的用途相似,但是有本质的区别,这里就不多说了。

使用QDateTime来获取当前时间:
# 修改时间的展示样式
self.qsb.setDisplayFormat('yyyy-MM-dd* hh:mm:ss')
设置日期的显示范围:
# 设置日期范围
# self.qsb.setMaximumDateTime(QDateTime(2022,3,23,0,6))
# self.qsb.setMinimumDateTime(QDateTime(1900,3,23,0,6))
# 设置范围为前3天和后3天
self.qsb.setDateTimeRange(QDateTime().currentDateTime().addDays(-3),QDateTime().currentDateTime().addDays(3))
# 日历选择 打开日历
self.qsb.setCalendarPopup(True)

# 获取时间和日期
print(self.qsb.dateTime())
print(self.qsb.date())
print(self.qsb.time())
# 可用信号
self.qsb.dateTimeChanged.connect(lambda: print(self.qsb.dateTime())) # 日期时间发生改变
self.qsb.timeChanged.connect(lambda: print(self.qsb.time())) # 时间发生改变
self.qsb.dateChanged.connect(lambda: print(self.qsb.date())) #日期发生改变
5 QComboBox下拉框控件
QComboBox下拉框控件也属于另一种样式的组合控件,虽然和之前学习的步长调节器有很多不同之处,但是也属于步长调节器的一种,这节课主要讲一下QComboBox下拉框控件属性、API和条目设置等功能,其中条目设置比较重要。

- 添加条目


# 1. 增加条目
# self.qcb.addItem("pyqt5的网站")
# self.qcb.addItem(QIcon("fy.png"),"Pyq5教程") # 图片和文本
self.qcb.addItems(("java","python","C++"))
2. 插入条目
self.qcb.insertItem(2,"JS") # 在指定位置插入条目
self.qcb.insertItem(2,"JS") # 在指定位置插入条目
self.qcb.insertItem(2, QIcon("fy.png"),"JS")
self.qcb.insertItems(2,("java","python","C++"))
# 3。 设置(修改)条目
self.qcb.setItemText(2,"China") # 修改文本内容
self.qcb.setItemIcon(2,QIcon("male.png")) # 修改图片
4. 删除条目
qcb.insertSeparator(2) # 在位置2处插入分割线

- 默认值设定
下拉菜单默认显示第一个。
self.qcb.setCurrentIndex(1)
# self.qcb.setCurrentText("java") # 设置为下拉列表中的值
self.qcb.setCurrentIndex(1)
# self.qcb.setCurrentText("java") # 设置为下拉列表中的值
self.qcb.setEditable(True) # 设置文本可编辑
self.qcb.setEditText("WWWWW") # 设置文本
- 数据获取
self.qcb.addItem(QIcon("fy.png"),"Pyq5教程",{"name":"张三"}) # 图片和文本
print(self.qcb.count()) # 获取下拉框的条目数
print(self.qcb.itemIcon(2)) # 获取第二个位置的图片
print(self.qcb.itemText(3)) # 获取第3个位置的文本
print(self.qcb.currentText()) # 获取当前条目的文本
print(self.qcb.currentIndex()) # 获取当前条目的索引
print(self.qcb.itemData(0)) # 获取指定条目的数据 返回{"name":"张三"}
print(self.qcb.currentData()) # 获取当前条目的数据
- 下拉框条目数限制
self.qcb.setMaxCount(3) # 设置最大存储条目的个数
self.qcb.setMaxVisibleItems(2) # 设置最大可见的条目个数
-
可重复
self.qcb.setDuplicatesEnabled(True) -
有边框
self.qcb.setFrame(False) -
图标尺寸
self.qcb.setIconSize(QSize(30,30)) -
尺寸调整策略
self.qcb.setSizeAdjustPolicy(QComboBox.AdjustToContentsOnFirstShow)
AdjustToContents = 0
AdjustToContentsOnFirstShow = 1
AdjustToMinimumContentsLength = 2
AdjustToMinimumContentsLengthWithIcon = 3
-
清空
self.qcb.clear()
self.qcb.clearEditText() # 清空被编辑的内容 -
弹出下拉框
self.qcb.showPopup() -
下拉匹配
self.qcb.setCompleter(QCompleter(("java","python","C++")))
self.qcb.setCompleter(QCompleter(("java","python","C++")))
16. 可用信号

from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.resize(600,500)
self.move(300,300)
self.funclist()
def funclist(self):
self.func()
def func(self):
self.qcb = QComboBox(self)
self.qcb.move(150,150)
self.qcb.resize(150,40)
self.btn = QPushButton("按钮",self)
self.btn.resize(60,30)
self.btn.move(150,250)
self.btn.pressed.connect(self.test)
def test(self):
# 1. 增加条目
# self.qcb.addItem("pyqt5的网站")
self.qcb.addItem(QIcon("fy.png"),"Pyq5教程",{"name":"张三"}) # 图片和文本
self.qcb.addItems(("java","python","C++"))
#2. 插入条目
self.qcb.insertItem(2,"JS") # 在指定位置插入条目
self.qcb.insertItem(2, QIcon("fy.png"),"JS")
self.qcb.insertItems(2,("java","python","C++"))
# 3。 设置(修改)条目
self.qcb.setItemText(2,"China") # 修改文本内容
self.qcb.setItemIcon(2,QIcon("male.png")) # 修改图片
# 4。删除条目
# self.qcb.removeItem(0)
# 5. 插入分割线
# self.qcb.insertSeparator(1)
# 6.设置默认值
# self.qcb.setCurrentIndex(1)
# # self.qcb.setCurrentText("java") # 设置为下拉列表中的值
self.qcb.setEditable(True) # 设置文本可编辑
# self.qcb.setEditText("WWWWW") # 设置文本
# 7.数据获取
print(self.qcb.count()) # 获取下拉框的条目数
print(self.qcb.itemIcon(2)) # 获取第二个位置的图片
print(self.qcb.itemText(3)) # 获取第3个位置的文本
print(self.qcb.currentText()) # 获取当前条目的文本
print(self.qcb.currentIndex()) # 获取当前条目的索引
print(self.qcb.itemData(0)) # 获取指定条目的数据
print(self.qcb.currentData()) # 获取当前条目的数据
# 8. 下拉框条目数限制
# self.qcb.setMaxCount(3) #设置最大存储条目的个数
# self.qcb.setMaxVisibleItems(2) # 设置最大可见的条目个数
# 9 .可重复
self.qcb.setDuplicatesEnabled(True)
self.qcb.setDuplicatesEnabled(False)
# 10.有边框
self.qcb.setFrame(False)
# 11.图标尺寸
self.qcb.setIconSize(QSize(30,30))
# 12.尺寸调整策略
self.qcb.setSizeAdjustPolicy(QComboBox.AdjustToContentsOnFirstShow)
# 13 清空
# self.qcb.clear()
self.qcb.clearEditText() # 清空被编辑的内容
# 14 弹出下拉框
self.qcb.showPopup()
# 15 下拉匹配
self.qcb.setCompleter(QCompleter(("java","python","C++")))
pass
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
级联选择案例:
from PyQt5.Qt import *
import sys
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("QComboBox下拉框案例 - PyQt5中文网")
self.resize(600, 500)
self.city_dic = {
'江苏省': {
'南京': '025',
'徐州市': '0516',
'淮安市': '0517',
'盐城市': '0515',
'扬州市': '0514',
'苏州市': '0512',
},
'浙江省': {
'杭州市': '0571',
'宁波市': '0574',
'金华市': '0579',
'舟山市': '0580',
'温州市': '0577',
'台州市': '0576',
},
'安徽省': {
'合肥市': '0551',
'滁州市': '0550',
'宿州市': '0557',
'巢湖市': '0565',
'黄山市': '0559',
'宣州市': '0563',
},
'河北省': {
'石家庄市': '0311',
'邯郸市': '0310',
'保定市': '0312',
'唐山市': '0315',
'沧州市': '0317 ',
'衡水市': '0318',
'邢台市': '0319',
},
}
self.func_list()
def func_list(self):
self.func()
def func(self):
self.qcb1 = QComboBox(self)
self.qcb1.move(100, 150)
self.qcb1.resize(100, 40)
self.qcb2 = QComboBox(self)
self.qcb2.move(240, 150)
self.qcb2.resize(100, 40)
# 1.获取省一级,这里要先链接信号,然后添加数据,数据从无到有也能触发信号
# self.qcb1.addItems(self.city_dic.keys())
self.qcb1.currentIndexChanged[str].connect(self.qcb1_changed)
self.qcb1.addItems(self.city_dic.keys())
# 2.获得当前选中省的名称
self.qcb1_changed(self.qcb1.currentText())
# 4.城市区号获取方法
self.qcb2.currentIndexChanged[int].connect(self.qcb2_changed)
self.qcb2_changed(self.qcb2.currentIndex())
def qcb1_changed(self, name):
# print(name)
# 3.根据省的名称到字典中查找下级城市名称
citys = self.city_dic[name]
# print(citys)
# 从字典中获取下级城市名称到下一个下拉框中
'''
# self.qcb2.addItems(citys.keys()) # 这只会追加城市,所以要清空之前的数据,在重新添加条目
self.qcb2.clear()
# self.qcb2.addItems(citys.keys())
'''
self.qcb2.blockSignals(True)
self.qcb2.clear() # 这里会出现None结果,参考97行代码
self.qcb2.blockSignals(False)
for key, val in citys.items(): # 通过增加val数据来获取
self.qcb2.addItem(key, val)
# print(citys.items())
def qcb2_changed(self, num): # 这里传入条目的索引值
# print(num) # 这里值为-1,会打印None
print(self.qcb2.itemData(num))
# 这里注意itemData()的用法
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
浙公网安备 33010602011771号