Python 创建自定义时间选择器小部件

Python 创建自定义时间选择器小部件,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我需要创建一个用于选择时间的小部件。QTimeEdit小部件看起来不直观,也不是一个好的设计。所以我决定创建一个类似于智能手机中的时间选择器的时间选择器 我设法创建了时钟并单击,使指针(类似于图像中的指针)移动到当前单击的位置(注意:它不是完美的,看起来仍然很糟糕)。我想请人帮我制作内部时钟 这是我的密码: 从PyQt5导入QtWidgets、QtGui、QtCore 导入数学,sys 类ClockWidget(qtwidts.QWidget):#我希望能够将该类也用于其他程序,因此请不要硬编

我需要创建一个用于选择时间的小部件。QTimeEdit小部件看起来不直观,也不是一个好的设计。所以我决定创建一个类似于智能手机中的时间选择器的时间选择器

我设法创建了时钟并单击,使指针(类似于图像中的指针)移动到当前单击的位置(注意:它不是完美的,看起来仍然很糟糕)。我想请人帮我制作内部时钟

这是我的密码:

从PyQt5导入QtWidgets、QtGui、QtCore
导入数学,sys
类ClockWidget(qtwidts.QWidget):#我希望能够将该类也用于其他程序,因此请不要硬编码列表、开始和结束的值
定义初始化(self、start、end、lst=[]、*args、**kwargs):
超级(ClockWidget,self)。\uuuuuuuuuuuuuuu初始化(*args,**kwargs)
self.lst=lst
如果不是self.lst:
self.lst=[*范围(开始、结束)]
self.index_start=0#调整此选项以移动圆圈中的字母
self.pointer_angles_multiplier=9#只需设置默认值
自身电流=无
self.rects=[]
@财产
def索引_启动(自):
返回自我。\u索引\u开始
@索引设置器
def索引_启动(自身,索引):
self.\u index\u start=索引
def paintEvent(自身,事件):
self.rects=[]
painter=QtGui.QPainter(自)
pen=QtGui.QPen()
pen.setColor(QtCore.Qt.red)
笔设置宽度(2)
画师:画笔
x、 y=self.rect().x(),self.rect().y()
宽度,高度=self.rect().width(),self.rect().height()
画家。抽屉(x,y,x+宽度,x+高度)
s、 t,等角度,半径=自身角度计算()
半径-=30
pen.setColor(QtCore.Qt.green)
笔设置宽度(2)
画师:画笔
“”“指针角度有助于确定指针应绘制到的位置”“”
self.pointer_x,self.pointer_y=s+((半径-30)*math.cos(self.pointer_角度乘子*相等角度)),t\
+((半径-30)*数学sin(自指针角度乘以相等角度))
“钟摆状指针”
绘制线(QtCore.QPointF(s,t),QtCore.QPointF(self.pointer_x,self.pointer_y))
painter.drawerlipse(QtCore.QRectF(QtCore.QPointF(self.pointer_x-20,self.pointer_y-40),
QtCore.QPointF(self.pointer_x+30,self.pointer_y+10)))
pen.setColor(QtCore.Qt.blue)
笔设置宽度(3)
font=self.font()
字体设置点大小(14)
painter.setFont(字体)
画师:画笔
“”“围绕圆绘制数字公式y=t+半径*cos(a)
y=s+半径*sin(a),其中角度以弧度表示(s,t)是圆的中点“”
对于索引,枚举中的字符(self.lst,start=self.index\u start):
角度=等角度*索引
y=t+半径*数学正弦(角度)
x=s+半径*数学cos(角度)
#打印(f“添加:{Add_x},索引:{index};字符:{char}”)
rect=QtCore.QRectF(x-30,y-40,x+60,y)#可点击点
self.rects.append([index,char,rect])#appends index,letter,rect
painter.setPen(QtCore.Qt.blue)
painter.drawRect(rect)#有助于可视化可以收到点击的点
打印(f“Rect:{Rect};char:{char}”)
画师设置笔(QtCore.Qt.red)
点=QtCore.QPointF(x,y)
画师.绘图文本(点,str(字符))
def鼠标压力事件(自身、事件):
对于self.rects中的x:
索引,char,rect=x
如果event.button()&QtCore.Qt.LeftButton和rect.contains(event.pos()):
self.pointer\u angles\u乘数=索引
self.current=char
self.update()
打破
def角度计算(自身):
"""
这将简单地返回(圆的中点),将圆划分为len(列表)并返回
角度(弧度、半径)
"""
返回((self.rect().width()-self.rect().x())/2,(self.rect().height()-self.rect().y())/2,
(360/len(self.lst))*(math.pi/180),(self.rect().width()/2))
def resizeEvent(self,事件:QtGui.QResizeEvent):
“”“这应该在调整小部件大小时保持正方形纵横比,但不起作用。”
正如您在执行“”时看到的那样正确
如果event.size().width()>event.size().height():
self.resize(event.size().height(),event.size().width())
其他:
self.resize(event.size().width(),event.size().width())
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=qtwidts.QApplication(sys.argv)
message=ClockWidget(1,13)
message.index_start=10
message.show()
sys.exit(app.exec())
输出:

蓝色矩形表示可单击区域。如果您也能在时钟内单击时将指针移动到最近的数字,我将非常高兴(而不仅仅是在蓝色区域内单击时移动指针)


在我的代码中还有一个问题,那就是数字与外圆的间隔不是均匀的。(就像数字12比数字6更接近外圆)

免责声明:我不会解释错误的原因,但我认为我提供的代码应该给出错误的明确解释

逻辑是计算每个小圆的中心位置,并使用Exinscripted矩形作为绘制文本的基础,并检查单击的点是否靠近文本

从functools导入缓存的\u属性
输入数学
导入系统
从PyQt5导入QtCore、QtGui、QtWidgets
类ClockWidget(qtwidts.QWidget):
L=12
r=40.0
DELTA_角度=2*math.pi/L
当前指数=9
def油漆平衡