好久没有发文,最近一直学习PyQt5中,特别把学习心得反馈给大家一起交流共同成长
以下为源代码,已附注释。
import sys
from PyQt5.QtWidgets import *
'''
通过设置计数器上的数据,从而实现当计数器为0时,向上增加有效,计数器是9时,向下减少有效,否则计数器返回空值。
并通过MyASB类内部方法stepBy,返回结果p_int输出。
'''
class MyASB(QAbstractSpinBox):
#因为MyASB是从计数器的父类继承的,所以以下self全部虚指‘计数器’
#这里parent=None是定义父类方法可以为None
#这里num=0是定义一个初始值,如果调用时没有给num传值,系统自动调用0
def __init__(self,parent=None,num=0,*args,**kwargs):
#注此处parent不能等于None,因为这里是调用父类方法不是定义方法
super().__init__(parent,*args,**kwargs)
#这里lineEdit()是计数器的组合控件-行编辑,用来显示数据
self.lineEdit().setText(str(num))
def stepEnabled(self): #先执行获取p_int值,供后面stepBy()方法使用
#此处current_num用来接收来自计数器的文本,转成int传递,实现if判断
current_num = int(self.text())
if int(self.text()) == 0:
return QAbstractSpinBox.StepUpEnabled # 向上点击按钮有效
elif current_num == 9:
return QAbstractSpinBox.StepDownEnabled #向下点击按钮有效
elif current_num < 0 or current_num > 9: #向上向下点击无效,此处值传递p_int
return QAbstractSpinBox.StepNone
else:
#向上和向下都能有效使用
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
#p_int:随着向上点击,值增加1,向下点击值-1,接收鼠标的点击值
def stepBy(self, p_int):
#int(self.text())---指把获取的计数文本转为整型数据与原数据相加,实现累积增加效果
#p_int指步长值
print(p_int)
current_num = int(self.text()) + p_int
#从当前计数器组合的lineEdit调用方法setText实现修改显示数据的效果
self.lineEdit().setText(str(current_num))
class Window(QWidget):
def __init__(self):
super().__init__()
# 设置标题与初始大小
self.setWindowTitle('求和问题')
self.resize(500, 500)
self.setup_ui()
#定义计数器
def setup_ui(self):
#这里的self必须写,否则无法显示计数器,这里的self是MyASB继承的父对象QAbstractSpinBox
asb = MyASB(self,9)#参数9是传给变量num的自定义数据值
asb.resize(100,30) #计数器尺寸大小
asb.move(50,50)#计数器位置
#以下用来执行程序
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
为了更好的使用布局方法,以下是对上面代码修改重新布局后的效果

源代码如下:
import sys
from PyQt5.QtWidgets import *
'''
通过设置计数器上的数据,从而实现当计数器为0时,向上增加有效,计数器是9时,向下减少有效,否则计数器返回空值。
并通过MyASB类内部方法stepBy,返回结果p_int输出。
'''
class MyASB(QAbstractSpinBox):
#因为MyASB是从计数器的父类继承的,所以以下self全部虚指‘计数器’
#这里parent=None是定义父类方法可以为None
#这里num=0是定义一个初始值,如果调用时没有给num传值,系统自动调用0
def __init__(self,parent=None,num=0,*args,**kwargs):
#注此处parent不能等于None,因为这里是调用父类方法不是定义方法
super().__init__(parent,*args,**kwargs)
#这里lineEdit()是计数器的组合控件-行编辑,用来显示数据
self.lineEdit().setText(str(num))
def stepEnabled(self): #先执行获取p_int值,供后面stepBy()方法使用
#此处current_num用来接收来自计数器的文本,转成int传递,实现if判断
current_num = int(self.text())
if int(self.text()) == 0:
return QAbstractSpinBox.StepUpEnabled # 向上点击按钮有效
elif current_num == 9:
return QAbstractSpinBox.StepDownEnabled #向下点击按钮有效
elif current_num < 0 or current_num > 9: #向上向下点击无效,此处值传递p_int
return QAbstractSpinBox.StepNone
else:
#向上和向下都能有效使用
return QAbstractSpinBox.StepUpEnabled | QAbstractSpinBox.StepDownEnabled
#p_int:随着向上点击,值增加1,向下点击值-1,接收鼠标的点击值
def stepBy(self, p_int):
#int(self.text())---指把获取的计数文本转为整型数据与原数据相加,实现累积增加效果
#p_int指步长值
print(p_int)
current_num = int(self.text()) + p_int
#从当前计数器组合的lineEdit调用方法setText实现修改显示数据的效果
self.lineEdit().setText(str(current_num))
class Window(QWidget):
def __init__(self):
super().__init__()
# 设置标题与初始大小
self.setWindowTitle('计数器调节')
self.resize(100, 50)
layout = QVBoxLayout()
self.label = QLabel('我的计数器',self)
self.setup_ui()
self.my_layout()
#定义计数器
def setup_ui(self):
#这里的self必须写,否则无法显示计数器,这里的self是MyASB继承的父对象QAbstractSpinBox
asb = MyASB(self,9)#参数9是传给变量num的自定义数据值
self.asb = asb
asb.resize(100,30) #计数器尺寸大小
asb.move(50,50)#计数器位置
def my_layout(self):
layout = QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.asb)
self.setLayout(layout)
#以下用来执行程序
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
心得体会:
代码的使用,必须要多练习,勤于动手,才能对使用代码过程中产生的问题有深入的思考
代码使用过程中,出现问题,及时搜索找到答案才能在以后避免重新犯错,代码的学习是一个不断纠错的循序的过程,有时一个错误往往要浪费很久的时间才能找到,但是这时间花的是有价值的,可能你找到问题后,会有一种刻骨铭心的记忆,类似错误不会再犯,类似不懂的问题一下子全部了解了,祝大家学习开心!