在PyQt添加SQlider滑动条后,发现鼠标点击时滑块只能按照设定步数一步步移动,不能点哪里滑块到哪里。网上查找资料后发现这方面相关参考资料比较少,且大多数文章表述对我个人来说比较难理解,最后综合参考几篇较好的文章后才实现功能,在这里记录一下具体实现方法。
目录
一. 设计UI界面
二. 将.ui文件转为.py文件
三. 重写QSlider的鼠标点击事件
四. 添加窗口运行查看效果**
一. 设计UI界面
为了方便直观设计界面,UI设计在Qt Designer中完成。
首先,在Qt Designer中创建一个Widget窗体,如下图。
然后,将界面左侧水平滑动条直接拖到窗体中,添加两个,名称分别为horizontalSlider和horizontalSlider_2,点击保存。
二. 将.ui文件转为.py文件
在PyCharm中,通过PyUic工具将刚刚保存的slider_test.ui文件转化为.py文件,具体过程请参考相关教程。
转化成功后会有一个slider_test.py文件。
三. 重写QSlider的鼠标点击事件
双击打开slider_test.py文件(也可不在Qt Designer中设计,直接创建.py文件复制程序)。
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(487, 402)
self.horizontalSlider = QtWidgets.QSlider(Form)
self.horizontalSlider.setGeometry(QtCore.QRect(60, 140, 361, 31))
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName("horizontalSlider")
self.horizontalSlider_2 = QtWidgets.QSlider(Form)
self.horizontalSlider_2.setGeometry(QtCore.QRect(60, 230, 361, 31))
self.horizontalSlider_2.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_2.setObjectName("horizontalSlider_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
然后,创建MySlider类,继承自QSlider,在类中重写鼠标点击事件mousePressEvent。将slider_test.py代码中的horizontalSlider_2滑动条改为自己创建的MySlider类,horizontalSlider滑动条不做修改。具体代码:
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import pyqtSignal
from PyQt5.QtWidgets import QSlider
class MySlider(QSlider): # 继承QSlider
customSliderClicked = pyqtSignal(str) # 创建信号
def __init__(self, parent=None):
super(QSlider, self).__init__(parent)
def mousePressEvent(self, QMouseEvent): # 重写的鼠标点击事件
super().mousePressEvent(QMouseEvent)
pos = QMouseEvent.pos().x() / self.width()
self.setValue(round(pos * (self.maximum() - self.minimum()) + self.minimum())) # 设定滑动条滑块位置为鼠标点击处
self.customSliderClicked.emit("mouse Press") # 发送信号
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(487, 402)
self.horizontalSlider = QtWidgets.QSlider(Form) # 滑动条1
self.horizontalSlider.setGeometry(QtCore.QRect(60, 140, 361, 31))
self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider.setObjectName("horizontalSlider")
self.horizontalSlider_2 = MySlider(Form) # 滑动条2,修改此处
self.horizontalSlider_2.setGeometry(QtCore.QRect(60, 230, 361, 31))
self.horizontalSlider_2.setOrientation(QtCore.Qt.Horizontal)
self.horizontalSlider_2.setObjectName("horizontalSlider_2")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
四. 添加窗口运行查看效果
创建一个slider.py文件,代码如下:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from slider_test import Ui_Form
class MainWindow(Ui_Form, QMainWindow): # 创建窗口
def __init__(self):
super().__init__()
self.setupUi(self)
self.horizontalSlider.valueChanged.connect(self.horizontalSlider_change) # 滑动条1数值变化时触发horizontalSlider_change
self.horizontalSlider_2.customSliderClicked.connect(
self.horizontalSlider_2_change) # 鼠标点击滑动条2,接收mousePressEvent发送的信号后触发horizontalSlider_2_change2
def horizontalSlider_change(self):
print('滑动条1发生变化')
def horizontalSlider_2_change(self): # 触发事件写在该函数中
print('滑动条2发生变化')
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
运行slider.py文件,出现界面后,上面的滑动条1在点击时只能一步一步移动,而下面的滑动条2可以鼠标点哪滑块到哪里。最终效果如下:
参考文章2中有直接在Python中实现滑块点哪到哪功能参考程序。
初次发表,如有错误请指正,谢谢。文章来源:https://www.toymoban.com/news/detail-486951.html
参考文章
1.PyQt5 — 进度条拖动点击视频播放
2.Moving QSlider to Mouse Click Position文章来源地址https://www.toymoban.com/news/detail-486951.html
到了这里,关于PyQt实现QSlider滑块鼠标点击事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!