QSlider使用笔记

最近做项目使用到QSlider滑动条控件,在使用过的过程中,发现一个问题就是点滑动条上的一个位置,滑块并没有移动到鼠标点击的位置,体验感很差,于是研究了下,让鼠标点击后滑块移动到鼠标点击的位置。
1、eventFilter采用事件过滤的方式:
给QSlider安装事件过滤器,重写事件过滤方法:
ui->hSliderAge->installEventFilter(this);

bool Dialog::eventFilter(QObject *watched, QEvent *event)
{if(ui->hSliderAge == watched && event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);if(mouseEvent->button() == Qt::LeftButton){//方法1:
//            int curValue = ui->hSliderAge->maximum() - ui->hSliderAge->minimum();
//            int curPos = ui->hSliderAge->minimum() + curValue*(static_cast<double>(mouseEvent->x()) / ui->hSliderAge->width());
//            ui->hSliderAge->setValue(curPos);//方法2:int value = QStyle::sliderValueFromPosition(ui->hSliderAge->minimum(), ui->hSliderAge->maximum(), mouseEvent->pos().x(), ui->hSliderAge->width());ui->hSliderAge->setValue(value);}}return QDialog::eventFilter(watched, event);
}

运行效果:

这种方式是每个QSlider控件都要写到eventFilter函数里进行处理,如果有多个QSlider控件就会非常混乱,那有没有一种自定义控件的方式来实现这个功能,下面就介绍这种方法。

2、自定义QSlider控件实现点击效果。

#ifndef CUSTOMSLIDER_H
#define CUSTOMSLIDER_H#include <QSlider>class CustomSlider : public QSlider
{Q_OBJECT
public:explicit CustomSlider(QWidget *parent = nullptr);protected:void mousePressEvent(QMouseEvent *event) override;signals:};#endif // CUSTOMSLIDER_H
#include "customslider.h"
#include <QMouseEvent>
#include <QDebug>
#include <QStyle>CustomSlider::CustomSlider(QWidget *parent): QSlider{parent}
{}void CustomSlider::mousePressEvent(QMouseEvent *event)
{//获取当前点击位置,得到的这个鼠标坐标是相对于当前QSlider的坐标int currentX = event->pos().x();//获取当前点击的位置占整个Slider的百分比double per = currentX *1.0 / this->width();//利用算得的百分比得到具体数字int value = per*(this->maximum() - this->minimum()) + this->minimum();//int value2 = QStyle::sliderValueFromPosition(this->minimum(), this->maximum(), currentX, this->width());//double value3 = per*(this->maximum() - this->minimum()) + this->minimum();//设定滑动条位置this->setValue(value);//滑动条移动事件等事件也用到了mousePressEvent,加这句话是为了不对其产生影响,是的Slider能正常相应其他鼠标事件QSlider::mousePressEvent(event);
}

使用:

运行效果:

完整代码如下:

#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECTpublic:Dialog(QWidget *parent = nullptr);~Dialog();void initData();public slots:void slotValueChangedSliderAge(int value);void slotValueChangedSpinBoxAge(int value);void slotValueChangedSlider(int value);void slotValueChangedSpinBox(int value);protected:bool eventFilter(QObject *watched, QEvent *event) override;bool eventFilter2(QObject *watched, QEvent *event);private:Ui::Dialog *ui;
};
#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QMouseEvent>
#include <QStyle>Dialog::Dialog(QWidget *parent): QDialog(parent), ui(new Ui::Dialog)
{ui->setupUi(this);initData();
}Dialog::~Dialog()
{delete ui;
}void Dialog::initData()
{ui->hSliderAge->installEventFilter(this);ui->hSliderAge->setValue(18);ui->spinBoxAge->setValue(18);//设置步长ui->hSliderAge->setSingleStep(4);ui->hSlider->setSingleStep(4);ui->spinBoxAge->setSingleStep(4);ui->spinBox->setSingleStep(4);ui->hSliderAge->setRange(0, 115);ui->hSlider->setRange(0, 115);ui->spinBoxAge->setRange(0, 115);ui->spinBox->setRange(0, 115);//滑动条托动释放时触发信号ui->hSliderAge->setTracking(false);ui->hSlider->setTracking(false);connect(ui->hSliderAge, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedSliderAge(int)));connect(ui->spinBoxAge, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedSpinBoxAge(int)));connect(ui->hSlider, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedSlider(int)));connect(ui->spinBox, SIGNAL(valueChanged(int)), this, SLOT(slotValueChangedSpinBox(int)));
}void Dialog::slotValueChangedSliderAge(int value)
{ui->spinBoxAge->blockSignals(true);ui->spinBoxAge->setValue(value);ui->spinBoxAge->blockSignals(false);
}void Dialog::slotValueChangedSpinBoxAge(int value)
{ui->hSliderAge->blockSignals(true);ui->hSliderAge->setValue(value);ui->hSliderAge->blockSignals(false);
}void Dialog::slotValueChangedSlider(int value)
{ui->spinBox->blockSignals(true);ui->spinBox->setValue(value);ui->spinBox->blockSignals(false);
}void Dialog::slotValueChangedSpinBox(int value)
{ui->hSlider->blockSignals(true);ui->hSlider->setValue(value);ui->hSlider->blockSignals(false);
}bool Dialog::eventFilter(QObject *watched, QEvent *event)
{if(ui->hSliderAge == watched && event->type() == QEvent::MouseButtonPress){QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);if(mouseEvent->button() == Qt::LeftButton){//方法1:
//            int curValue = ui->hSliderAge->maximum() - ui->hSliderAge->minimum();
//            int curPos = ui->hSliderAge->minimum() + curValue*(static_cast<double>(mouseEvent->x()) / ui->hSliderAge->width());
//            ui->hSliderAge->setValue(curPos);//方法2:
//            int value = QStyle::sliderValueFromPosition(ui->hSliderAge->minimum(), ui->hSliderAge->maximum(), mouseEvent->pos().x(), ui->hSliderAge->width());
//            ui->hSliderAge->setValue(value);//方法3:eventFilter2(watched, event);}}return QDialog::eventFilter(watched, event);
}bool Dialog::eventFilter2(QObject *watched, QEvent *event)
{if(watched == ui->hSliderAge && event->type() == QEvent::MouseButtonPress){QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);//捕获左键按下if(mouseEvent->button() == Qt::LeftButton){int chunkLen{0};       //滑块宽度int sliderLen{0};      //滑槽宽度int mousePos{0};       //鼠标按下的位置//水平滑动条if(ui->hSliderAge->orientation() == Qt::Horizontal){chunkLen = ui->hSliderAge->minimumSizeHint().width();sliderLen = ui->hSliderAge->width();if(ui->hSliderAge->invertedAppearance()){mousePos = sliderLen - mouseEvent->x();}else{mousePos = mouseEvent->x();}}else{//垂直滑动条chunkLen = ui->hSliderAge->minimumSizeHint().height();sliderLen = ui->hSliderAge->height();if(ui->hSliderAge->invertedAppearance()){mousePos = sliderLen - mouseEvent->y();}else{mousePos = mouseEvent->y();}}if(sliderLen > chunkLen){//计算位置,设置滑动位置int curValue = ui->hSliderAge->maximum() - ui->hSliderAge->minimum();int sliderPos = ui->hSliderAge->minimum() +(int)(curValue * (mousePos - chunkLen/2.0)/(sliderLen - chunkLen));if(ui->hSliderAge->sliderPosition() != sliderPos){ui->hSliderAge->setSliderPosition(sliderPos);}}}}return QDialog::eventFilter(watched, event);
}

参考:
https://www.cnblogs.com/Gaaagaa/p/12130799.html
https://blog.csdn.net/lion_cxq/article/details/128212132
https://blog.csdn.net/qq_14945437/article/details/98730805

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/250992.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录element-plus树型表格的bug

问题描述 如果数据的子节点命名时children,就没有任何问题&#xff0c;如果后端数据结构子节点是其他名字&#xff0c;比如thisChildList就有bug const tableData [{id: 1,date: 2016-05-02,name: wangxiaohu,address: No. 189, Grove St, Los Angeles,selectedAble: true,th…

2024 IC FPGA 岗位 校招面试记录

引言 各位看到这篇文章时&#xff0c;24届校招招聘已经渐进尾声了。 在这里记录一下自己所有面试&#xff08;除了时间过短或者没啥干货的一些研究所外&#xff0c;如中电55所&#xff08;南京&#xff09;&#xff0c;航天804所&#xff08;上海&#xff09;&#xff09;的经…

【安装指南】maven下载、安装与配置详细教程

&#x1f33c;一、概述 maven功能与python的pip类似。 Apache Maven是一个用于软件项目管理和构建的强大工具。它是基于项目对象模型的&#xff0c;用于描述项目的构建配置和依赖关系。以下是一些关键的 Maven 特性和概念&#xff1a; POM&#xff08;Project Object Model&…

Javaweb之SpringBootWeb案例之 @ConfigurationProperties的详细解析

4.3 ConfigurationProperties 讲解完了yml配置文件之后&#xff0c;最后再来介绍一个注解ConfigurationProperties。在介绍注解之前&#xff0c;我们先来看一个场景&#xff0c;分析下代码当中可能存在的问题&#xff1a; 我们在application.properties或者application.yml中配…

神经网络 | 基于多种神经网络模型的轴承故障检测

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要源自《第二届全国技能大赛智能制造工程技术项目比赛试题&#xff08;样题&#xff09; 模块 E 工业大数据与人工智能应用》&#xff0c;基于给出的已知轴承状态的振动信号样本&#xff0c;对数据进行分析&#xff0c;建…

CMake生成osg的FFMPEG插件及Windows下不生成VS工程问题解决

在Windows下&#xff0c;如何利用CMake生成osg的FFMPEG插件&#xff0c;请参考如下博文&#xff0c;同生成jpeg插件类似&#xff1a; osg第三方插件的编译方法&#xff08;以jpeg插件来讲解&#xff09;。 如下为生成FFMPEG时必要的设置&#xff1a; 注意&#xff1a; 一定要…

Transformer实战-系列教程3:Vision Transformer 源码解读1

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 1、整体解读 在文本任务中大量使用了Transformer 架构&#xff0c;因为文本数据是一个序列非常好…

Django响应式图像库django-pictures

什么是响应式图像&#xff1f; 响应式设计是指网页在不同尺寸的设备上都有良好的显示效果。响应式设计的网页图像&#xff0c;就是响应式图像。 django-pictures是使用现代代码&#xff08;如 AVIF 和 WebP&#xff09;的响应式跨浏览器图像库。 特点 使用 Picture 标签的响应…

QSqlRelationalTableModel 关系表格模型

一、 1.1 QSqlRelationalTableModel继承自QSqlTableModel&#xff0c;并且对其进行了扩展&#xff0c;提供了对外键的支持。一个外键就是一个表中的一个字段 和 其他表中的主键字段之间的一对一的映射。例如&#xff0c;“studInfo”表中的departID字段对应的是“departments…

Spring Boot导出EXCEL 文件

主要功能:实现java导出excel到本地 JDK版本&#xff1a;openJDK 20.0.1 依赖pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

Python 数据分析(PYDA)第三版(一)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 关于开放版本 第 3 版的《Python 数据分析》现在作为“开放获取”HTML 版本在此网站wesmckinney.com/book上提供&#xff0c;除了通常的印刷和电子书格式。该版本最初于 2022 年…

OpenSSL:configure: error: OpenSSL library not found解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

如何使用 Google 搜索引擎保姆级教程(附链接)

一、介绍 "Google语法"通常是指在 Google 搜索引擎中使用一系列特定的搜索语法和操作符来精确地定义搜索查询。这些语法和操作符允许用户过滤和调整搜索结果&#xff0c;提高搜索的准确性。 二、安装 Google 下载 Google 浏览器 Google 官网https://www.google.c…

LNMP.

一.mysl配置 1.安装mysql yum install mysql-server -y 2.进入mysql配置文件目录 cd /etc/my.cnf.d3.编辑mysql配置文件 vim mysql-server.cnf 在[mysqld]中添加: character-set-serverutf84.启动mysql服务 systemctl start mysqld5.登入mysql mysql 6.创建数据库 cre…

中国大学生计算机设计大赛与大数据应用主题赛

中国大学生计算机设计大赛 与大数据应用主题赛 中国大学生计算机设计大赛&#xff08;简称“大赛”或4C&#xff09;始筹于2007年&#xff0c;首届于2008年&#xff0c;已经举办了16届80场赛事。是我国高校面向本科生最早的赛事之一&#xff0c;由教育部计算机类教指委发起举…

使用wda框架实现IOS自动化测试详解

目录 1、weditor元素定位工具 1.1、weditor的安装和使用 2、wda iOS自动化框架 2.1、wda概述 2.2、wda安装 2.3、wda的使用 2.3.1、全局配置 2.3.2、创建客户端 2.3.3、APP相关操作 1、启动APP 2、关闭APP 3、获取APP状态信息 4、获取当前APP的运行信息 2.3.4、设…

LLM之Agent(十一)| 多智能体框架CrewAI与AutoGen相比

基于LLM构建的Agent中有一个明显的现象就是多智能体体系结构的表现要超越单智能体&#xff0c;即使单智能体使用无可挑剔的提示策略。本文将探索另一个有趣的多智能体框架——CrewAI。 一、CrewAI整体优势 CrewAI可以应用在生成环境中。它在发言人的反应和编排上牺牲了一点灵活…

Unity | Spine动画记录

https://blog.csdn.net/linshuhe1/article/details/79792432 https://blog.csdn.net/winds_tide/article/details/128925407 1.需要的三个文件 通常制作好的 Spine 动画导出时会有三个文件&#xff1a; .png 、.json 和 .atlas&#xff1a; skeleton-name.json 或 skeleton-…

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题&#xff1f;以…

2017年苏州大学837复试机试C/C++

2017年苏州大学复试机试 要求 要求用C/C编程&#xff1b;对程序中必要的地方进行注释。上机规则 请在电脑桌面上新建一个文件夹文件夹名为考试姓名&#xff08;中文&#xff09;&#xff1b;考试完毕后&#xff0c;将所编写的文件放在上述文件中。 第一题&#xff08;20分&…