PyQt/QSlider/ClickJumpSlider.py
2021-07-13 14:52:26 +08:00

88 lines
3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on 2018年11月5日
@author: Irony
@site: https://pyqt.site , https://github.com/PyQt5
@email: 892768447@qq.com
@file: ClickJumpSlider
@description:
"""
try:
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QSlider, QStyleOptionSlider, QStyle, QWidget, QFormLayout, \
QLabel
except ImportError:
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QApplication, QSlider, QStyleOptionSlider, QStyle, QWidget, QFormLayout, \
QLabel
class ClickJumpSlider(QSlider):
def mousePressEvent(self, event):
# 获取上面的拉动块位置
option = QStyleOptionSlider()
self.initStyleOption(option)
rect = self.style().subControlRect(
QStyle.CC_Slider, option, QStyle.SC_SliderHandle, self)
if rect.contains(event.pos()):
# 如果鼠标点击的位置在滑块上则交给Qt自行处理
super(ClickJumpSlider, self).mousePressEvent(event)
return
if self.orientation() == Qt.Horizontal:
# 横向要考虑invertedAppearance是否反向显示的问题
self.setValue(self.style().sliderValueFromPosition(
self.minimum(), self.maximum(),
event.x() if not self.invertedAppearance() else (self.width(
) - event.x()), self.width()))
else:
# 纵向
self.setValue(self.style().sliderValueFromPosition(
self.minimum(), self.maximum(),
(self.height() - event.y()) if not self.invertedAppearance(
) else event.y(), self.height()))
class DemoWindow(QWidget):
def __init__(self, *args, **kwargs):
super(DemoWindow, self).__init__(*args, **kwargs)
self.resize(600, 600)
layout = QFormLayout(self)
self.label1 = QLabel('0', self)
self.slider1 = ClickJumpSlider(Qt.Horizontal)
self.slider1.valueChanged.connect(lambda v: self.label1.setText(str(v)))
layout.addRow(self.label1, self.slider1)
# 横向-反向显示
self.label2 = QLabel('0', self)
self.slider2 = ClickJumpSlider(Qt.Horizontal, invertedAppearance=True)
self.slider2.valueChanged.connect(lambda v: self.label2.setText(str(v)))
layout.addRow(self.label2, self.slider2)
self.label3 = QLabel('0', self)
self.slider3 = ClickJumpSlider(Qt.Vertical, minimumHeight=200)
self.slider3.valueChanged.connect(lambda v: self.label3.setText(str(v)))
layout.addRow(self.label3, self.slider3)
# 纵向反向显示
self.label4 = QLabel('0', self)
self.slider4 = ClickJumpSlider(Qt.Vertical, invertedAppearance=True, minimumHeight=200)
self.slider4.valueChanged.connect(lambda v: self.label4.setText(str(v)))
layout.addRow(self.label4, self.slider4)
if __name__ == '__main__':
import sys
import cgitb
cgitb.enable(format='text')
app = QApplication(sys.argv)
w = DemoWindow()
w.show()
sys.exit(app.exec_())