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_())
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?