Python桌面开发pyqt5—QAbstractSpinBox及子类

本文详细介绍了Qt库中的几个基础控件,如自定义的QAbstractSpinBox,以及QSpinBox、QDoubleSpinBox、QDateTimeEdit、QComboBox和QFontComboBox的使用方法、属性设置和信号处理。

QAbstractSpinBox

定义

class MyASB(QAbstractSpinBox):
	'''设置控件可以使用'''
	def __init__(self, parent=None, num='0', *args, **kwargs):
		super().__init__(parent, *args, **kwargs)
		self.lineEdit().setText('0')
	def stepEnabled(self):
		# 需求:只能在0-9调节
		if self.text:
			number = eval(self.text())
			if number == 0:
				return QAbstractSpinBox.StepUpEnabled
			elif number == 9:
				return QAbstractSpinBox.StepDownEnabled
			elif number > 9 or number < 0:
				return QAbstractSpinBox.StepNone
			else:
				return QAbstractSpinBox.StepDownEnabled | QAbstractSpinBox.StepUpEnabled
	def stepBy(self, p_int):
		cur_num = int(self.text()) + p_int
		self.lineEdit().setText(str(cur_num))

简单方法

asb = MyASB(self)

# 设置文本
asb.lineEdit().setText('-3')				
# 获取文本
asb.text()							# 法0
asb.lineEdit().text()				# 法1
# 清除文本
asb.clear()

# 设置提示内容
c = QCompleter(['123','11','aaa'],asb)		
asb.lineEdit().setCompleter(c)				# 将c添加到asb的lineEdit中

# 设置对齐方式(居中)
asb.lineEdit().setAlignment(Qt.AlignCenter)	# 法0
asb.setAlignment(Qt.AlignRight)				# 法1

# 设置是否有边框
asb.setFrame(False)
# 获取是否有边框
print(asb.hasFrame())

# 设置步长调节器样式
'''UpDownArrows:箭头(默认)
NoButtons:无符号
PlusMinus:加减号.'''
asb.setButtonSymbols(QAbstractSpinBox.PlusMinus)

# 设置加速
asb.setAccelerated(True)	# 一直按着鼠标,变化的越来越快
# 获取是否为加速
print(asb.isAccelerated())

# 设置只读
asb.setReadOnly(True)		# 这里的只读是指只能通过步长调节器调节,不能手动输入
# 获取是否只读
print(asb.isReadOnly())

设置读取内容

asb = MyASB(self, '1')
asb.resize(100, 30)
asb.move(10, 50)
btn = QPushButton('lineEdit下', self)
btn.move(10, 200)
btn_1 = QPushButton('abs下', self)
btn_1.move(110, 200)

# lineEdit()下的属性
def func():
    print(asb.text())  # 获取内容_0
    print(asb.lineEdit().text())  # 获取内容_1
    asb.lineEdit().setText('-3')  # 设置文本
    c = QCompleter(['123', '11', 'aaa'], asb)  # 设置提示内容
    asb.lineEdit().setCompleter(c)  # 将c添加到asb的lineEdit中
    asb.lineEdit().setAlignment(Qt.AlignCenter)  # 设置对齐方式(居中)

btn.clicked.connect(func)

# QAbstractSpinBox下的
def func_1():
    asb.setAlignment(Qt.AlignRight)  # 直接设置对齐方式
    print(asb.hasFrame())  # 判断是否有边框
    asb.setFrame(False)  # 设置是否右边框,默认为True(有边框# )
    asb.setButtonSymbols(
        QAbstractSpinBox.PlusMinus)  # 设置步长调节器的样式,默认为UpDownArrows(箭头)。NoButtons -> 无符号。PlusMinus -> 加减号.
    asb.clear()  # 清除文本内容

btn_1.clicked.connect(func_1)

内容验证

# 验证时机:失去焦点时
class ASB(MyASB):
    def __init__(self, parent=None, num='0', *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

    def validate(self, p_str, p_int):
        '''验证'''
        # 需求:数字在18-180之间
        num = int(p_str)
        if num < 18:
            return (QValidator.Intermediate, p_str, p_int)
        elif num <= 180:
            return (QValidator.Acceptable, p_str, p_int)
        else:
            return (QValidator.Invalid, p_str, p_int)

    def fixup(self, p_str):
        '''修补'''
        print(p_str)
        return '18'

asb = ASB(self, '1')
asb.resize(100, 30)
asb.move(10, 50)

信号

asb = MyASB(self, '1')
# 编辑结束
asb.editingFinished.connect(lambda :print('完成编辑'))

QSpinBox

在这里插入图片描述

简单方法

sb = QSpinBox(self)

# 设置最小值
sb.setMinimum(18)
# 获取最小值
print(sb.minimum())			# 默认为0

# 设置最大值
sb.setMaximum(180)
# 获取最大值
print(sb.maximum())			# 默认为99

# 设置范围
sb.setRange(18,180)			# 注意:包含最后一个数字(180)

# 设置值
sb.setValue(10)
# 获取值
print(sb.value())			# 只获取数字
# 获取文本
print(sb.text())
print(sb.lineEdit().text())	# 获取文本和数字,包括前后缀

# 设置循环
sb.setWrapping(True)		# 设置是否开启循环,默认为False(不循环)
# 获取是否开启了循环
print(sb.wrapping())

# 设置步长,但是不会超出范围
sb.setSingleStep(2)

# 前缀后缀
sb.setPrefix('这是第')				# 前缀
sb.setSuffix('月')				# 后缀
sb.setSpecialValueText('正月')	# 值为最小值时显示特殊文本

# 设置进制
sb.setDisplayIntegerBase(10)
# 获取几进制
print(sb.displayIntegerBase())

自定义格式展示

class SB(QSpinBox):
	'''重写这个类方法,格式改变,但是本身数值不会变'''
	def textFromValue(self, p_int):				# p_int就是当前值
		return str(p_int) + '*' + str(p_int)
sb = SB(self)
sb.resize(100, 30)

在这里插入图片描述

信号

sb = QSpinBox(self)
# 值改变
# 默认返回int类型(只返回值),可指定[str],返回text所有文本内容
sb.valueChanged[str].connect(lambda val: print('值变了', val))

QDoubleSpinBox

在这里插入图片描述

简单方法

dsb = QDoubleSpinBox(self)
# 设置范围
dsb.setMaximum(2.00)  # 最大值
dsb.setMinimum(1.00)  # 最小值
dsb.setRange(1.00, 2.00)  # 范围

# 设置步长
dsb.setSingleStep(0.1)

# 设置前后缀
dsb.setPrefix('当前倍速:')  # 前缀
dsb.setSuffix('倍')  # 后缀
dsb.setSpecialValueText('正常倍速')  # 设置最小值展示的特殊文本

# 开启数值循环
dsb.setWrapping(True)

# 设置保留小数位数
dsb.setDecimals(1)
# 获取保留的位数
print(dsb.decimals())

# 设置值,若值大于最大限制,会显示最大值
dsb.setValue(100.00)
# 获取值
print(dsb.value())  # 返回float类型,只获取数字
print(dsb.cleanText())  # 返回str类型,只获取数字
# 获取文本
print(dsb.text())
print(dsb.lineEdit().text())  # 返回str,包括前后缀、文字等内容

自定义格式展示

class DSB(QDoubleSpinBox):
	def textFromValue(self, p_float):			# p_float就是当前值
		'''重写这个类方法'''	
		return str(p_float) + '-->' +  str(p_float)
dsb = DSB(self)
dsb.resize(150, 30)

信号

dsb = QDoubleSpinBox(self)
# 返回float类型,只包含值,不含文本
dsb.valueChanged.connect(lambda val: print(val))
# 可指定[str],返回str类型,包含值和文本
dsb.valueChanged[str].connect(lambda val: print(val))

QDateTimeEdit

在这里插入图片描述

QDateTime/&QTime类

# 设定时间
# dt = QDateTime(2020, 3, 22, 14, 51)	# 自己设定时间
dt = QDateTime.currentDateTime()  # 使用现在的时间
dt = dt.addYears(-2)  # 加上-2年
# 获取和世界标准时间的时差(一般是8个小时,即28800秒)
dt.offsetFromUtc()

# QTime类
t = QTime.currentTime()
t.start()
# 获取程序运行了多少ms
btn.clicked.connect(lambda: print('经历了{}秒'.format(t.elapsed() / 1000)))

QDate/&TimeEdit

dte = QDateTimeEdit(QDateTime.currentDateTime() , self)

# QDateEdit
de = QDateEdit(self)
# 设置格式
de.setDisplayFormat('yy-MMMM-dddd')	

# QTimeEdit
te = QTimeEdit(QTime.currentTime(), self)
# 设置时间展示格式
te.setDisplayFormat('a hh:m:ss')

在这里插入图片描述

在这里插入图片描述

获取日期时间

# 获取日期时间
print(dte.dateTime())
# 获取日期
print(de.date())	# PyQt5.QtCore.QDate(2021, 1, 1)
# 获取指定格式的日期字符串
print(de.date().toString('MM/dd/yyyy'))	# 01/01/2021
print(dte.time())  # 获取时间

格式化时间显示

btn = QPushButton('按钮', self)
btn.move(10, 200)
dte = QDateTimeEdit(QDateTime.currentDateTime(), self)
dte.resize(200, 30)
dte.move(10, 50)
dte.setDisplayFormat('yy-MM-d $ m:ss:zzz')  # 设置日期的显示格式

# 获取section个数
print(dte.sectionCount())  # 获取section个数

def func():
    dte.setFocus()
    dte.setCurrentSectionIndex(2)  # 设置section对应的索引
    dte.setCurrentSection(QDateTimeEdit.DaySection)  # 通过枚举设置section,这里与上一个等效
    print(dte.currentSectionIndex())  # 获取当前的索引值
    print(dte.sectionText(QDateTimeEdit.DaySection))  # 获取指定section的文本内容

btn.clicked.connect(func)

在这里插入图片描述

设置范围

dte = QDateTimeEdit(QDateTime.currentDateTime(), self)
# 设置最大最小值
dte.setMaximumDateTime(QDateTime.currentDateTime().addYears(10))#默认为9999年
dte.setMinimumDateTime(QDateTime.currentDateTime().addYears(-10))
# 默认为1752年9月14日00:00:00
dte.setDateTimeRange(QDateTime.currentDateTime().addYears(-10),QDateTime.curre										ntDateTime().addYears(10))# 和上面两个的等效
# 清除自定义的最值,恢复默认的最值
dte.clearMaximumDateTime()
dte.clearMinimumDateTime()

弹出日历

dte = QDateTimeEdit(QDateTime.currentDateTime(), self)
dte.resize(200, 30)
dte.move(10, 50)
# 弹出日历
dte.setCalendarPopup(True)

在这里插入图片描述

信号

dte = QDateTimeEdit(QDateTime.currentDateTime(), self)
dte.dateTimeChanged.connect(lambda var:print('日期时间改变了',var))
dte.dateChanged.connect(lambda var:print('日期改变了',var))
dte.timeChanged.connect(lambda var:print('时间改变了',var))

QComboBox

在这里插入图片描述

简单方法

cb = QComboBox(self)
cb.addItems(['haha', 'AAA', 'BBB', 'CCC'])

# 数据限制
cb.setMaxCount(6)		# 限制存储的最大条目数
cb.setEditable(True)	# 设置是否可以键盘输入增加条,默认为True(可添加)
cb.setMaxVisibleItems(4)# 限制显示的最大条目数
cb.setDuplicatesEnabled(True)	# 设置是否允许被编辑时数据重复,默认为False(不允许重复)
cb.setFrame(True)				# 是否显示边框,默认为True(显示)

# 模拟操作
cb.clear()			# 清空所有数据
cb.clearEditText()	# 清除编辑的内容
cb.showPopup()		# 打开下拉条目

# 性能优化
cb.setIconSize(QSize(40,40))	# 修改图标的尺寸
cb.setSizeAdjustPolicy(QComboBox.AdjustToContents)# 设置文本框大小随条目大小显示策略
cb.setCompleter(QCompleter(['123,''aaa', 'www']))	# 设置提示内容

数据条目操作

cb = QComboBox(self)
# 添加条目
cb.addItem(QIcon('./resources/unity.png'), 'unity')  # 可以加图标
cb.addItems(['python', 'java', 'c#', 'c++'])

# 在指定索引处插入条目
cb.insertItem(2, QIcon('./resources/big_flower.png'), 'R语言')
cb.insertItems(3, ['1', '2', '3'])

# 修改指定索引的条目
cb.setItemIcon(2, QIcon('./resources/可见.png'))
cb.setItemText(2, '不是R语言')

# 删除指定索引的条目
cb.removeItem(8)  # 不要写-1

添加特殊数据

# 创建并添加数据模型
model = QStandardItemModel()
item_0 = QStandardItem('0')
item_1 = QStandardItem('1')
item_1_0 = QStandardItem('1_0')
item_1.appendRow(item_1_0)
model.appendRow(item_0)
model.appendRow(item_1)

# QComboBox配置参数
cb = QComboBox(self)
cb = QComboBox(self)
cb.setModel(model)
cb.setView(QTreeView(cb))

在这里插入图片描述

数据获取

cb = QComboBox(self)
cb.addItems(['haha', 'AAA', 'BBB', 'CCC'])
cb.addItem(QIcon('./resources/unity.png'), 'unity', {'name': 'U3D'})
btn = QPushButton('按钮', self)
btn.move(10, 200)

# 数据获取
def func():
    print(cb.count())  # 获取当前的条目数
    print(cb.currentIndex())  # 获取当前条目的索引
    print(cb.currentText())  # 获取当前条目的文本
    print(cb.currentData)  # 获取当前条目的数据类型(addItem的第三个参数)
    btn.setIcon(cb.itemIcon(cb.currentIndex()))  # 获取当前索引的图标对象(并设置为按钮的图标)
    print(cb.itemIcon(cb.count() - 1), cb.itemText(cb.count() - 1), cb.itemData(cb.count() - 1))

btn.clicked.connect(func)  # 获取最后一个条目的所有信息

QFontComoBox简单方法

label = QLabel('Hello Unity World!', self)
label.resize(150, 60)
label.move(250, 100)

fcb = QFontComboBox(self)
fcb.move(100, 100)

# 信号监听
fcb.currentFontChanged.connect(lambda font: label.setFont(font))

# 设置为不可编辑,只能选择
fcb.setEditable(False)

在这里插入图片描述

案例

province = QComboBox(self)
city = QComboBox(self)
province.move(100, 50)
city.move(250, 50)
province.resize(100, 30)
city.resize(100, 30)

info = {
    '北京': {
        '石景山': '001',
        '朝阳': '002',
        '海淀': '003',
        '丰台': '004'
    },
    '山东': {
        '青岛': '005',
        '济南': '006',
        '烟台': '007',
        '日照': '008'
    },
    '湖北': {
        '武汉': '009',
        '黄冈': '010',
        '黄石': '011',
        '宜昌': '012'
    }
}

# 监听省下拉列表发出信号
def func(pro_name):
    cities = info[pro_name]
    city.blockSignals(True)  # 临时阻断信号
    city.clear()  # 清除时不向外界发射信号,以免出现None
    city.blockSignals(False)  # 打开信号
    # city.addItems(cities)
    for key, value in cities.items():
        city.addItem(key, value)

province.currentIndexChanged[str].connect(func)
# func(province.currentText())

# 监听城市下拉并发出信号
def func_1(city_index):
    print(city.itemData(city_index))
city.currentIndexChanged[int].connect(func_1)
# func_1(city.currentIndex())

# 展示数据到第一个控件
province.addItems(info.keys())

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值