没有找到Qt的滑动条控件,所以自己写了一个,能够实现亮度调节、音量调节等功能。

效果如下图:

主要设计思路:

有些调节功能如对比度是有负值的,所以需要能对滑动条的数值范围进行设置,不局限于0~100

鼠标拖动时滑动块能随着鼠标移动,右侧的数字也跟着变化

鼠标释放时认为对数值设置成功,触发某个操作

代码思路:

整个窗口继承QWdiget,画一条横线,滑块也是画出的粗线

数值设置成功后的动作使用回调函数,设计一个回调基类,当数值设置成功后,调用回调基类的回调函数。

重写鼠标单击、移动、释放的事件响应函数,当鼠标按下时,设置变量mousedown为true,当鼠标移动时,判断mousedown是否为true,如果是true,则更新滑块的坐标信息,然后出发窗口的重绘。

鼠标释放时设置mousedown为false,与鼠标滑动一样,更新滑块的坐标信息,触发窗口重绘,然后调用回调函数完成对数值的设置。

具体代码:

回调基类:

 #ifndef TRACKBARCALLBACK_H
#define TRACKBARCALLBACK_H class TrackBarCallBack
{
public:
TrackBarCallBack();
virtual void callBack(int value);
}; #endif // TRACKBARCALLBACK_H
 #include "trackbarcallback.h"

 TrackBarCallBack::TrackBarCallBack()
{
} void TrackBarCallBack::callBack(int value)
{
}

TrackBarCallBack.cpp

滑动条类:

trackbar.h

 #ifndef TRACKBAR_H
#define TRACKBAR_H
#include <QWidget>
#include "trackbarcallback.h" class TrackBar: public QWidget
{
public:
TrackBar(TrackBarCallBack *callBack, int width=, int height=, int start=, int end=);
void setPosition(int position);
void mouseReleaseEvent(QMouseEvent *);
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *);
void mouseMoveEvent(QMouseEvent *);
private:
TrackBarCallBack *callBack;
int start;//数值范围起点
int end;//数值范围终点
int position;
bool mousedown;
int widthOfLine;//横线的长度
}; #endif // TRACKBAR_H

trackbar.cpp

 #include "trackbar.h"
#include <QWidget>
#include <QPainter>
#include <QMouseEvent> TrackBar::TrackBar(TrackBarCallBack *callBack, int width, int height, int start, int end):QWidget()
{
this->callBack=callBack;
this->start = start;
this->end = end;
this->setMinimumSize(width,height);
this->setMaximumSize(width,height);
this->position = end;//竖线的位置,标识亮度的数值
this->mousedown = false;//为了实现拖动效果,先判断是否点下了鼠标,然后鼠标移动才有效
} void TrackBar:: mouseReleaseEvent(QMouseEvent *event){
this->mousedown=false;//鼠标放下后,鼠标移动不再具有拖动效果
int pos=event->x();
if(pos<)//减5是因为显示的时候为了好看左边从5的位置开始显示,当作刻度0
position = start;
else if(pos>(widthOfLine+))
position = end;
else{
double ratio = 1.0 * (pos - ) / widthOfLine;
position = (end - start) * ratio + start;
}
update();//触发重绘操作,生成paintEvent事件 callBack->callBack(position);//回调函数
} void TrackBar::paintEvent(QPaintEvent *){
QPainter p(this);
p.setPen(QPen(Qt::lightGray, ));//写字用的这个字体,先用这个字体获取字的像素大小
int widthOfTitle = + 1.2 * p.fontMetrics().width(QString::number(-end));//最右显示数字需要的大小,加负号防止出现负数(-100~100)
int w =width() - widthOfTitle;
widthOfLine = w -;
p.setPen(Qt::lightGray);
p.drawLine(QPoint(,height()/),QPoint(w,height()/));//中间的横线
p.setPen(QPen(Qt::lightGray, ));
double ratio = 1.0 * (position - start)/(end - start);
if(ratio < ){
ratio = -ratio;
}
int posX = (w - ) * ratio + ;
p.drawLine(QPoint(posX,),QPoint(posX,height()-));//竖线,标识亮度数值的位置
int heightOfTitle = p.fontMetrics().height();
p.drawText(w+,height()/ + heightOfTitle/,QString::number(position));//写文字的y坐标是文字的底部坐标
} void TrackBar:: mousePressEvent(QMouseEvent *){
this->mousedown=true;//鼠标按下,之后鼠标移动操作产生拖动效果
} void TrackBar::mouseMoveEvent(QMouseEvent *event){//鼠标移动事件,是否是拖动需要判断是否鼠标按下了
if(mousedown==false)
return;
//下面的跟鼠标释放操作是一样的
int pos=event->x();
if(pos<)//减5是因为显示的时候为了好看左边从5的位置开始显示,当作刻度0
position = start;
else if(pos>(widthOfLine+))
position = end;
else{
double ratio = 1.0 * (pos - ) / widthOfLine;
position = (end - start) * ratio + start;
}
update();//触发重绘操作,生成paintEvent事件
} void TrackBar::setPosition(int position){
this->position = position;
}

使用滑动条&测试

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include "trackbarcallback.h"
#include "trackbar.h" namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow,public TrackBarCallBack
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
void callBack(int value);
~MainWindow(); private:
Ui::MainWindow *ui;
TrackBar *trackBar;
}; #endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <qdebug.h> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
trackBar = new TrackBar(this,,,-,);
trackBar->setWindowTitle(QString("正负数值设置"));
trackBar->show();
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::callBack(int value){
qDebug()<<"value:"<<value;
}

Qt滑动条设计与实现的更多相关文章

  1. Qt基础学习---滑动条之QSlider

    Qt滑动条基本用法: //mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QLineEd ...

  2. Qt基础学习(3)-----滑动条之QSlider

    //mydialog.h #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog> class QLineEdit; class Q ...

  3. PyQt(Python+Qt)学习随笔:QSlider滑动条部件功能简介

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.概述 Designer输入部件中的Horizo ...

  4. Qt的皮肤设计(Style Sheet)

      Qt的皮肤设计,也可以说是对Qt应用程序的界面美化,Qt使用了一种类CSS的样式规则QSS. 一.Style Sheet的应用 1.直接在程序代码中设置样式,利用setStyleSheet()方法 ...

  5. python_Opencv_滑动条用法

    前言: 创建一个简单的程序来说明滑动条用法:通过调节滑动条来设定画板颜色. 我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R 的颜色. 当我们滑动滚动条是窗口的颜色也会发生相应改变. 默认 ...

  6. 滑动条QSlider

    QSlider只提供整数范围 滑块接受Tab键的焦点,并同时提供了一个鼠标滚轮和键盘接口.键盘接口如下: Left/Right 移动水平滑块一个步长.Up/Down 移动垂直滑块一个步长.PageUp ...

  7. 【转】自定义(滑动条)input[type="range"]样式

    1.如何使用滑动条? 用法很简单,如下所示: <input type="range" value="0"> 各浏览器原始样式如下: Chrome:  ...

  8. CircularSlider半弧形滑动条

    前言 这边文章主要 是写 一.半圆弧型滑块的设计 最近项目中需要用到半圆弧形滑块,其作用和UISlider差不多,用于拖动改变播放音乐的播放进度. 大概样子是这样的: 效果展示 特点如下: 滑动响应区 ...

  9. 第15.44节、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

随机推荐

  1. hbase性能优化总结

    hbase性能优化总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都 ...

  2. vim&vi在编辑的时候突然卡死,不接收输入问题的解决

    多方查找无果,看了官方解释如下: "CTRL-S and CTRL-Q are called flow-control characters. They represent an antiq ...

  3. TP框架自带的正则验证的规则

    thinkphp框架里面自带有很多自动验证的规则,下面是框架自带的正则验证的规则,官方的说明文档里面没有这么多,所以记下来,以备使用. view sourceprint? 01 static $reg ...

  4. 什么是redis,redis能做什么,redis应用场景

    Redis是一个key-value存储系统.Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用.这篇文章小编为大家分享了在 ...

  5. Centos系统下Lamp环境的快速搭建(超详细)

    lamp的搭建对于初学者是一件很头疼的事情,所以借此机会把自己当初快速搭建linux+apche+mysql+php的方法分享大家希望能到你. 工具/原料 虚拟机及Centos操作系统 Linux基本 ...

  6. [原创]消灭eclipse中运行启动的错误:“找不到或无法加载主类”问题

    最近一直遇到这个问题且根据网上的文章做法基本无法通过,故将自己的解决步骤记录及分享给大家. 一:环境必须要配置好. 试试在dos界面输入:java.javac 分别这两个命令是否能执行,如果都能执行恭 ...

  7. Spring-事务配置和详解

    一.Spring事务配置 在项目开发过程中经常会使用事务来确保数据的一致性.根据网上的资料整理一下在spring中配置事务的几种方式.无论是哪种方式都需要在配置文件中配置连接池和事务管理器,代码如下. ...

  8. yum错误,Cannot find a valid baseurl for repo: base 和 No more mirrors to try

    可能出错原因: 1. yum 配置错误 2. 虚拟机无法连接外网 3. 域名解析没有 如何解决这个错误? 1. 网上找 /ect/yum.conf 和 /etc/yum.repos.d/CentOS- ...

  9. Python---多线程(threading)

    1. 概述 threading提供线程相关操作,python当前版本的多线程库没有实现优先级.线程组,线程也不能被停止.暂停.恢复和中断 threading提供的类: Thread,Lock,Rloc ...

  10. linux相关概念

    最近这段时间玩Linux比较多,前面我也转载了好多的相关的Linux指令.这里自己关于Linux概念来自己整理一下. 首先我们应该知道Linux到底是什么? 我们知道Linux这玩意儿是在计算机上面运 ...