PyQt实现QSlider滑块鼠标点击事件

在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中实现滑块点哪到哪功能参考程序。
初次发表,如有错误请指正,谢谢。

参考文章
1.PyQt5 — 进度条拖动点击视频播放
2.Moving QSlider to Mouse Click Position

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值