gpt4 book ai didi

python - 移动 QSlider 到鼠标点击位置

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:45 26 4
gpt4 key购买 nike

我有一个 QSlider,我想在用户按下鼠标左键时移动到鼠标光标的位置。我一直在四处寻找,找不到任何新的东西来解决我的问题。

Progress Bar

这是我的 slider 。我希望能够点击让 slider 跳转到鼠标点击的位置。我可以拖动 slider ,但我希望能够单击。我测试了点击 Dolphin 文件管理器中的 slider 。它递增而不是跳到鼠标的确切位置。

查看 Qt5 documentation

QSlider has very few of its own functions [...]

这表明没有内置方法可以做到这一点。有没有办法获取鼠标点击的位置并将 slider 移动到该点?

最佳答案

解决方案是计算位置并设置在mousePressEvent中,计算不像算术计算那么容易,因为它取决于每个操作系统的样式和样式表,所以我们必须使用QStyle,如下所示:

from PyQt5 import QtCore, QtWidgets


class Slider(QtWidgets.QSlider):
def mousePressEvent(self, event):
super(Slider, self).mousePressEvent(event)
if event.button() == QtCore.Qt.LeftButton:
val = self.pixelPosToRangeValue(event.pos())
self.setValue(val)

def pixelPosToRangeValue(self, pos):
opt = QtWidgets.QStyleOptionSlider()
self.initStyleOption(opt)
gr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderGroove, self)
sr = self.style().subControlRect(QtWidgets.QStyle.CC_Slider, opt, QtWidgets.QStyle.SC_SliderHandle, self)

if self.orientation() == QtCore.Qt.Horizontal:
sliderLength = sr.width()
sliderMin = gr.x()
sliderMax = gr.right() - sliderLength + 1
else:
sliderLength = sr.height()
sliderMin = gr.y()
sliderMax = gr.bottom() - sliderLength + 1;
pr = pos - sr.center() + sr.topLeft()
p = pr.x() if self.orientation() == QtCore.Qt.Horizontal else pr.y()
return QtWidgets.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), p - sliderMin,
sliderMax - sliderMin, opt.upsideDown)


if __name__ == '__main__':
import sys

app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
flay = QtWidgets.QFormLayout(w)
w1 = QtWidgets.QSlider(QtCore.Qt.Horizontal)
w2 = Slider(QtCore.Qt.Horizontal)
flay.addRow("default: ", w1)
flay.addRow("modified: ", w2)
w.show()
sys.exit(app.exec_())

关于python - 移动 QSlider 到鼠标点击位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52689047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com