Python PyQt滑块不会到达我单击的特定位置,而是移动到特定的步幅

Python PyQt滑块不会到达我单击的特定位置,而是移动到特定的步幅,python,qt,pyqt,Python,Qt,Pyqt,例如,我们有一个PYQT5的QSlider实例,从左到右,从0到100% 当我单击50%位置时,控制柄不会直接移动到50%,而只是以恒定的步幅移动。 我该怎么办?您指的是“绝对设置”选项,它完全依赖于当前样式。滑块通过查询有关SH_slider_absolutesButtons的QStyle来检查该行为,该按钮使用(可能为空)掩码进行响应 默认情况下,用左键在控制柄外部按只会从当前滑块位置向鼠标光标重复滚动,而用中键按则会将滑块精确放置在光标所在的位置(取决于OS和QStyle) 如果要覆盖此选

例如,我们有一个PYQT5的QSlider实例,从左到右,从0到100% 当我单击50%位置时,控制柄不会直接移动到50%,而只是以恒定的步幅移动。
我该怎么办?

您指的是“绝对设置”选项,它完全依赖于当前样式。滑块通过查询有关
SH_slider_absolutesButtons
的QStyle来检查该行为,该按钮使用(可能为空)掩码进行响应

默认情况下,用左键在控制柄外部按只会从当前滑块位置向鼠标光标重复滚动,而用中键按则会将滑块精确放置在光标所在的位置(取决于OS和QStyle)

如果要覆盖此选项,有两种可能性

代理样式替代 这是通过使用QProxyStyle并覆盖前面提到的
styleHint
实现的。不幸的是,QSlider只是查询有关提示的样式,而没有提供widget参数,因此无法知道哪个滑块发送了请求。结果是,该行为将成为应用程序中所有QSlider的全局行为,除非您仅将该样式应用于需要该行为的滑块,但这可能会导致一些问题和不一致,特别是在您已经需要使用代理样式的情况下

class ProxyStyle(QtWidgets.QProxyStyle):
def styleHint(self、hint、opt=None、widget=None、returnData=None):
res=super().styleHint(提示、选项、小部件、返回数据)
如果提示==self.SH\u滑块\u绝对设置按钮:
res |=QtCore.Qt.LeftButton
返回res
app=qtwidts.QApplication(sys.argv)
#为应用程序全局设置样式
app.setStyle(ProxyStyle())
slider=qtwidts.QSlider()
#或者只是为了滑球
slider.setStyle(ProxyStyle())
覆盖
mouseButtonPress
此选项依赖于子类化和部分重写鼠标按钮按下事件。诀窍是检查按下的按钮,如果滑块当前未按下(以避免按下多个按钮时出现意外行为),则在鼠标位置移动滑块,最后调用基本
mouseButtonPress
实现:因为此时手柄将位于鼠标下方,滑块将“相信”手柄已经在那里,因此开始实际的滑块移动

class SliderCustom(qtwidts.QSlider):
def鼠标压力事件(自身、事件):
如果event.button()==QtCore.Qt.LeftButton而不是self.isSliderDown():
opt=qtwidts.QStyleOptionSlider()
self.initStyleOption(opt)
sliderRect=self.style().subcrolrect(
qtwidts.QStyle.CC_滑块,可选,
qtwidts.QStyle.SC_滑块手柄,self)
如果event.pos()不在sliderRect中:
#鼠标不在手柄上,让我们移动它;这是基于
在原始的C++代码上移动句柄时
#按下“绝对按钮”
groov直立=self.style().subcrolrect(
qtwidts.QStyle.CC_滑块,可选,
qtwidts.QStyle.SC_SliderGroove,self)
center=sliderRect.center()-sliderRect.topLeft()
pos=事件。pos()-中心
如果self.orientation()==QtCore.Qt.Horizontal:
sliderLength=sliderRect.width()
sliderMin=groov直立.x()
sliderMax=groov直立.right()-sliderLength+1
位置=位置x()
其他:
sliderLength=sliderRect.height()
sliderMin=groov直立.y()
sliderMax=groov直立.bottom()-滑块长度+1
位置=位置y()
value=self.style().sliderValueFromPosition(
self.minimum()、self.maximum()、pos-sliderMin、,
sliderMax-sliderMin,opt.upsideDown
)
self.setSliderPosition(值)
super().mousePressEvent(事件)

谢谢你,伙计。我就是这么想的need@Hadid不客气!请记住,如果答案解决了您的问题,您应该单击其左侧的灰色勾号,将其标记为已接受。