当前位置: 首页 > news >正文

Qt自定义QSlider(支持水平垂直)

实现背景:
Qt本身有自己的QSlider,为什么我们还要自定义实现呢,因为Qt自带的QSlider存在一个问题,当首尾为圆角时,滑动滚动条到首尾时会出现圆角变成矩形的问题。当然如果QSS之间的margin和滑动条的圆角控制的好的话是不会出现这个问题的,但是我们一般都是按照美工设计来完成工作的,如果她的设计是必须一摸一样的话,这个margin和圆角配合不了出现以上问题的话,那我们就需要实现一个自定义的QSlider了。

实现思路:
1、继承QWidget或者QSlider都可以,当然如果我们继承QSlider的话,那还不如使用重写QStyle的方式来重绘。
2、使用paintevent绘制事件来进行重绘。
3、配合mouse鼠标事件实现拖动功能。
4、配合resizeEvent事件来实现自适应大小。

实现效果:
请添加图片描述

实现代码:
头文件:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QPainter>
#include <QMouseEvent>class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr);~Widget();void reset();   //复位void setDirection(int dire){m_direction = dire;}
protected:void mousePressEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void resizeEvent(QResizeEvent *event);void paintEvent(QPaintEvent *event);
signals:void sig_Run();
private:QRect m_handleRect;bool m_pressFlag = false;bool m_autoFg = false;int m_lastX = 0;int m_lastY = 0;int m_direction = 0; //0:水平,1:垂直QPixmap m_handlepix;
};#endif // WIDGET_H

cpp文件:

#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent) :QWidget(parent)
{}Widget::~Widget()
{
}void Widget::resizeEvent(QResizeEvent *event)
{if (m_direction == 0)m_handleRect = QRect(1,1,height(),height() - 2);elsem_handleRect = QRect(1,height() - width(),width(),width() - 2);
}
void Widget::paintEvent(QPaintEvent *event)
{QPainter p(this);p.setRenderHint(QPainter::Antialiasing);p.setPen(QColor("#ffffff"));p.setBrush(QColor("#ffffff"));if (m_direction == 0)p.drawRoundedRect(this->rect(),height()/2,height()/2);elsep.drawRoundedRect(this->rect(),width()/2,width()/2);//滑轨前半部分QLinearGradient linearGradient(QPoint(0,0),QPoint(0,height()));linearGradient.setColorAt(0,QColor("#56B478"));linearGradient.setColorAt(0.7,QColor("#006009"));linearGradient.setColorAt(1,QColor("#56B478"));QBrush brush(linearGradient);p.setBrush(brush);if (m_direction == 0)p.drawRoundedRect(QRect(1,1,m_handleRect.right(),height()-2),height()/2,height()/2);elsep.drawRoundedRect(QRect(1,1,width(),m_handleRect.bottom()-2),width()/2,width()/2);//滑轨后半部分QBrush brush1(QColor("#606060"));p.setBrush(brush1);if (m_direction == 0)p.drawRoundedRect(QRect(m_handleRect.left(),1,width() - m_handleRect.left() - 2,height()-2),height()/2,height()/2);elsep.drawRoundedRect(QRect(1,m_handleRect.top(),width()-2,height() - m_handleRect.top()),width()/2,width()/2);//文本p.setPen(QColor("#ffffff"));p.setBrush(QColor("#ffffff"));p.setFont(QFont("Microsoft YaHei",8));p.drawText(2*width()/3,0,width()/3,height(),Qt::AlignCenter,"进度条");//滑动块//    p.drawPixmap(m_handleRect,m_handlepix);p.setPen(QColor("#ffffff"));p.setBrush(QColor("#842245"));p.drawEllipse(m_handleRect);
}void Widget::mousePressEvent(QMouseEvent *event)
{qDebug()<<m_handleRect<<event->pos();if (m_handleRect.contains(event->pos())){m_pressFlag = true;}}void Widget::mouseMoveEvent(QMouseEvent *event)
{if (m_pressFlag){if (m_direction == 0){int x = event->x();if (event->x() >= this->rect().right())x = this->rect().right() - 1;qDebug()<<x<<m_lastX<<width();if (x > this->rect().right() - m_handleRect.width())x = this->rect().right() - m_handleRect.width();if (x < 0)x = 0;m_handleRect = QRect(x,m_handleRect.y(),m_handleRect.width(),m_handleRect.height());if (m_autoFg){if (x > m_lastX && m_handleRect.right() >= this->rect().right() - width()/3){m_handleRect = QRect(this->rect().width() - m_handleRect.width() - 1,m_handleRect.y(),m_handleRect.width(),m_handleRect.height());}else if (m_handleRect.left() <= 0)m_handleRect = QRect(1,m_handleRect.y(),m_handleRect.width(),m_handleRect.height());m_lastX = x;}}else{int  y = event->y();if (event->y() >= this->rect().bottom())y = this->rect().bottom() - 1;if (y > this->rect().bottom() - m_handleRect.height())y = this->rect().bottom() - m_handleRect.height();if (y < 0)y = 0;m_handleRect = QRect(m_handleRect.x(),y,m_handleRect.width(),m_handleRect.height());if (m_autoFg){if (y < m_lastY && m_handleRect.top() <= height()/3){m_handleRect = QRect(m_handleRect.x(),1,m_handleRect.width(),m_handleRect.height());}m_lastY = y;}}update();}
}void Widget::mouseReleaseEvent(QMouseEvent *event)
{//autoif (m_autoFg){if (m_handleRect.right() != this->rect().right() - 1){m_handleRect = QRect(1,m_handleRect.y(),m_handleRect.width(),m_handleRect.height());update();}else {emit sig_Run();}}elseemit sig_Run();m_pressFlag = false;}void Widget::reset()
{m_handleRect = QRect(1,m_handleRect.y(),m_handleRect.width(),m_handleRect.height());update();
}

相关文章:

Qt自定义QSlider(支持水平垂直)

实现背景&#xff1a; Qt本身有自己的QSlider&#xff0c;为什么我们还要自定义实现呢&#xff0c;因为Qt自带的QSlider存在一个问题&#xff0c;当首尾为圆角时&#xff0c;滑动滚动条到首尾时会出现圆角变成矩形的问题。当然如果QSS之间的margin和滑动条的圆角控制的好的话是…...

会话控制学习

文章目录 介绍cookieexpress中使用cookie获取cookie session配置区别 介绍 cookie express中使用cookie 退出登录就是删除cookie 获取cookie 添加中间键后&#xff0c;直接获取 session 配置 区别...

dweb-browser阅读

dweb-browser阅读 核心模块js.browser.dwebjmm.browser.dwebmwebview.browser.dwebnativeui.browser.dweb.sys.dweb plaoc插件 核心模块 js.browser.dweb 它是一个 javascript-runtime&#xff0c;使用的是 WebWorker 作为底层实现。它可以让您在 dweb-browser 中运行 javasc…...

ChatGPT:使用fastjson读取JSON数据问题——如何使用com.alibaba.fastjson库读取JSON数据的特定字段

ChatGPT&#xff1a;使用fastjson读取JSON数据问题——如何使用com.alibaba.fastjson库读取JSON数据的特定字段 有一段Json字符串&#xff1a; {"code": 200,"message": "success","data": {"total": "1","l…...

2、ARM处理器概论

一、ARM处理器概述 1、ARM的含义 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义&#xff0c;一个公司的名称、一类处理器的通称、一种技术 ARM公司&#xff1a; 成立于1990年11月&#xff0c;前身为Acorn计算机公司主要设计ARM系列RISC处理器内核授权ARM内…...

【Python】福利彩票复式模拟选号程序

【效果】 【注意】 逻辑是用Random模拟10000次复试彩票选号,然后给出最大可能性一组。但是模拟终究是模拟,和现实彩票结果没有任何联系,下载下来玩就是了,没人能保证模拟出中奖号码,不要投机,不要投机! 【修改】 代码很简单,如果想改成不是复式的,自行修改即可。 如…...

Pytorch 机器学习专业基础知识+神经网络搭建相关知识

文章目录 一、三种学习方式二、机器学习的一些专业术语三、模型相关知识四、常用的保留策略五、数据处理六、解决过拟合与欠拟合七、成功的衡量标准 一、三种学习方式 有监督学习&#xff1a; 1、分类问题 2、回归问题 3、图像分割 4、语音识别 5、语言翻译 无监督学习 1、聚类…...

torch 和paddle 的GPU版本可以放在同一个conda环境下吗

新建conda 虚拟环境&#xff0c;python 版本3.8.17 虚拟机&#xff0c;系统centos 7,内核版本Linux fastknow 3.10.0-1160.92.1.el7.x86_64 &#xff0c;显卡T4&#xff0c;nvidia-smi ,460.32.03&#xff0c;对应cuda 11.2&#xff0c;安装cuda 11.2和cudnn&#xff0c;conda…...

MYBATIS-PLUS入门使用、踩坑记录

转载&#xff1a; mybatis-plus入门使用、踩坑记录 - 灰信网&#xff08;软件开发博客聚合&#xff09; 首先引入MYBATIS-PLUS依赖&#xff1a; SPRING BOOT项目&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus…...

C# 静态类和sealed类(密封类)的区别

网上看到很多文章写静态类&#xff0c;和密封类&#xff0c;但是鲜有它们的对比总结&#xff0c;在此简单总结一下&#xff1a; 静态类&#xff08;Static Class&#xff09;&#xff1a; 静态类不能被实例化&#xff0c;其成员都是静态的&#xff0c;可以通过类名直接访问。静…...

el-table如何实现自动缩放,提示隐藏内容

前提问题&#xff1a;大屏展示中某一个区域是表格内容&#xff0c;当放大或缩小网页大小时&#xff0c;表格宽度随之缩放&#xff0c;但表格内容未进行缩放&#xff0c;需要表格内容与网页大小同时进行缩放&#xff0c;且表头和表格内容宽度不够未显示全时&#xff0c;需要进行…...

CRM客户管理软件对出海企业的帮助与好处

2023我们走出了疫情的阴霾&#xff0c;经济下行压力大&#xff0c;面对内需的不足&#xff0c;国内企业纷纷选择出海&#xff0c;拓展海外业务增加企业营收。企业出海不是一件易事&#xff0c;有了CRM系统可以让公司事半功倍&#xff0c;下面就来说一说CRM客户管理软件能为出海…...

【QT--使用百度地图API显示地图并绘制路线】

QT--使用百度地图API显示地图并绘制路线 前言准备工作申请百度地图密钥(AK)安装开发环境 开发过程新建项目ui界面GPSManager类主窗口Map 效果展示 前言 先吐槽一下下&#xff0c;本身qt学的就不咋滴&#xff0c;谁想到第一件事就是让写一个上位机工具&#xff0c;根据CAN总线传…...

C数据结构二.练习题

一.求级数和 2.求最大子序列问题:设给定一个整数序列 ai.az..,a,(可能有负数).设计一个穷举算法,求a 的最大值。例如,对于序列 A {1,-1,1,-1,-1,1,1,1,1.1,-1,-1.1,-1,1,-1},子序列 A[5..9](1,1,1,1,1)具有最大值5 3.设有两个正整数 m 和n,编写一个算法 gcd(m,n),求它们的最大公…...

猫头虎博主第5️⃣期赠书活动:《Java官方编程手册(第12版·Java 17)套装上下册》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

(1)数据库 MSQ 数据库 安装 使用 以及增删改查

下载官网&#xff1a;MySQL :: Download MySQL Shell 常见的数据库分为&#xff1a; 关系型数据库&#xff0c; Oracle、MySQL、SQLServer、Access非关系型数据库&#xff0c; MongoDB、Redis、Solr、ElasticSearch、Hive、HBase 安装过程 使用过程...

什么测试自动化测试?

什么测试自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…...

【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

本周的工作结束&#xff0c;详述一些在项目代码中实际遇到的一些坑。 代码中遇到这样一个场景&#xff1a; 有个业务接口&#xff0c;接口返回的值是一个JSON格式的字符串&#xff0c;通过JSON解析的方式&#xff0c;解析为格式为&#xff1a; Map<Long, Map<String, O…...

微服务保护-授权规则/规则持久化

授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用者允许访问 黑名单&#xff1a;来源&#xff08;origin&#xff09;在黑名单内的调用者不允许访问 点…...

练习敲代码速度

2023年9月18日&#xff0c;周一晚上 今晚不想学习&#xff0c;但又不想玩游戏&#xff0c;于是找了一些练习敲代码的网站来玩玩&#xff0c;顺便练习一下敲代码的速度 目录 参考资料个人推荐第一个 第二个第三个 参考资料 电脑打字慢&#xff0c;有哪些比较好的练打字软件&a…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...