没有找到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. PHP pathinfo() 函数

    PHP pathinfo() 函数 完整的 PHP Filesystem 参考手册 定义和用法 pathinfo() 函数以数组或字符串的形式返回关于文件路径的信息. 返回的数组元素如下: [dirn ...

  2. dedecms中{dede:myad name='about'/} 修改内容

    网站首页index.htm中调用这个命令,显示一段文字,但是想要修改内容.所以想知道这个命令指定的文件内容在哪里寻找或者指定内容在哪里修改? 匿名 | 浏览 6036 次 发布于2014-02-19 ...

  3. <script>的用法

    <script> </script> 是指 在 HTML 页面中插入一段 JavaScript

  4. JavaScript学习日志:关于js分号

    javascript有自动添加分号的功能,但是不是所有情况都会自动添加,要区分: 1,如果语句独占一行 如果当前行内的语句能够被js正确解析,那么就会在句尾添加一个分号. (如何判断是否正确解析?你在 ...

  5. Express使用进阶:cookie-parser中间件实现深入剖析

    文章导读 cookie-parser是Express的中间件,用来实现cookie的解析,是官方脚手架内置的中间件之一. 它的使用非常简单,但在使用过程中偶尔也会遇到问题.一般都是因为对Express ...

  6. linux_nginx反向代理

    什么代理? 代理他人工作 什么是正向代理和反向向代理,他们之间的区别? 这两个代理很类似,但扮演了两个不同角色,一个站在用户角度,一个站在服务端角度 正向代理: 帮助用户请求服务 返向代理:帮助服务均 ...

  7. python_改变字符串中文本格式?

    案例: 某软件的日志文件,其中日期格式为year-moth-day: 2016-04-21 10:50:30 python 2014-05-22 10:50:30 python 2017-06-23 ...

  8. 了解ViewFlipper工作机制

    平时我们在使用ViewFlipper的时候一方面感叹ViewFlipper的使用很简单,另一方面,我们时常感叹ViewFlipper给我们的接口方法太少,很多常用的效果都不好做,很难施展拳脚,这篇文章 ...

  9. su鉴定故障

    su切换用户鉴定故障 [yolo1@izqfsfqp8ejn9zz ~]$ su root密码:su: 鉴定故障[yolo1@izqfsfqp8ejn9zz ~]$ sudo root 我们信任您已经 ...

  10. 【转】 要做linux运维工程师的朋友,必须要掌握以下几个工具才行

          本人是linux运维工程师,对这方面有点心得,现在我说说要掌握哪方面的工具吧 说到工具,在行外可以说是技能,在行内我们一般称为工具,就是运维必须要掌握的工具. 我就大概列出这几方面,这样入 ...