QT之重写滑条类

来源:互联网 发布:疯狂淘宝李涛是真是假 编辑:程序博客网 时间:2024/06/04 00:44

在VS的中的工程文件中,新建一个源文件和头文件,重写滑条类,最后在Qt Creator中拖进一个widget,将该widget提升为MySlider类,则该widget实现滑条的功能,且还可以通过改变样式表改变该滑条的形状和图案。

.h文件

#ifndef MySlider_H

#define MySlider_H


#include <QtWidgets/QWidget>
#include<QMouseEvent>
#include<QDebug>
#include<qbitmap.h>
#include<QPoint>
#include<QStyleOption>
#include<QPainter>
class MySlider : public QWidget
{
Q_OBJECT


public:
MySlider(QWidget *parent = 0);
~MySlider();
public:
QPoint m_movePoint;
bool m_flag_mousePress;   //按下鼠标左键
int m_maxValue;
int m_minValue;
int m_maxLimit;
int m_minLimit;
int m_X_moveDistance;
int m_Y_moveDistance;
void setLimitMaxValue(int);
void setLimitMinValue(int);
void set_X_movePos(int);
void set_Y_movePos(int);
Q_SIGNAL
void mouseEvent(QMouseEvent *event);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *event);     //单击
void mouseReleaseEvent(QMouseEvent *event);    //释放 
void mouseDoubleClickEvent(QMouseEvent *event);   //双击
void mouseMoveEvent(QMouseEvent *event);   //移动
void wheelEvent(QWheelEvent *event);    //滑轮
};


#endif // MySlider_H

.cpp文件

#include "MySlider.h"


MySlider::MySlider(QWidget *parent)
: QWidget(parent)
{
m_Y_moveDistance = 0;
}


MySlider::~MySlider()
{


}
void MySlider::paintEvent(QPaintEvent *)  //从QWidget子类化一个Widget,为了能够使用样式表则需要为自定义Widget提供paintEvent事件
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
void MySlider::mousePressEvent(QMouseEvent *event)       //单击实现
{
emit mouseEvent(event);
if (event->button() == Qt::LeftButton)  //按下鼠标左键
{
m_flag_mousePress = true;
}
//窗口移动位置
m_movePoint = event->globalPos() - this->pos();
}
void MySlider::mouseReleaseEvent(QMouseEvent *event)     //释放实现
{
m_flag_mousePress = false;
QPoint move_pos = event->globalPos();  //event->globalPos()获取的鼠标位置是鼠标偏离电脑屏幕左上角(x = 0, y = 0)的位置
QRect cc = this->geometry();
}
void MySlider::mouseDoubleClickEvent(QMouseEvent *event)
{


}
void MySlider::mouseMoveEvent(QMouseEvent *event)     //移动实现
{
emit mouseEvent(event);
if (m_flag_mousePress)
{
QPoint move_pos = event->globalPos();
QPoint move1 = move_pos - m_movePoint;


if (m_maxLimit > 1270 || m_maxLimit < 0)
{


}
else
{
m_maxValue = m_maxLimit;
if (move1.rx() < m_X_moveDistance)
{
move1.setX(m_X_moveDistance);
}
if (move1.rx()>m_maxValue)
{
move1.setX(m_maxValue);
}
}
if (m_minLimit > 1270 || m_minLimit < 0)
{


}
else
{
m_minValue = m_minLimit;
if (move1.rx() < m_minValue)
{
move1.setX(m_minValue);
}
}
move1.setY(m_Y_moveDistance);
move(move1);
}
}
void MySlider::wheelEvent(QWheelEvent *event)
{


}
void MySlider::setLimitMaxValue(int i)
{
m_maxLimit = i;
}
void MySlider::setLimitMinValue(int i)
{
m_minLimit = i;
}
void MySlider::set_Y_movePos(int i)
{
m_Y_moveDistance = i;
}
void MySlider::set_X_movePos(int i)
{
m_X_moveDistance = i;
}


#ifndef SLIDER1_H
#define SLIDER1_H


#include <QtWidgets/QWidget>
#include "ui_slider1.h"


class Slider1 : public QWidget
{
Q_OBJECT


public:
Slider1(QWidget *parent = 0);
~Slider1();
int a;
private:
Ui::Slider1Class ui;
public slots:
void moveslider(QMouseEvent *event);
};


#endif // SLIDER1_H


#include "slider1.h"


#include<QDebug>
Slider1::Slider1(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
a = this->width();
ui.sliderLeft->setGeometry(0, 100, 20, 20);
ui.sliderRight->setGeometry(a-20, 100, 20, 20);
ui.redsliderLeft->setGeometry(20, 100,20, 20);
ui.redsliderRight->setGeometry(a - 40, 100, 20, 20);
ui.sliderRight->set_Y_movePos(100);
ui.sliderLeft->set_Y_movePos(100);
ui.redsliderLeft->set_Y_movePos(100);
ui.redsliderRight->set_Y_movePos(100);
connect(this->ui.sliderLeft, SIGNAL(mouseEvent(QMouseEvent*)), this, SLOT(moveslider(QMouseEvent*)));    //左滑条
connect(this->ui.sliderRight, SIGNAL(mouseEvent(QMouseEvent*)), this, SLOT(moveslider(QMouseEvent*)));   //右滑条
connect(this->ui.redsliderLeft, SIGNAL(mouseEvent(QMouseEvent*)), this, SLOT(moveslider(QMouseEvent*)));
connect(this->ui.redsliderRight, SIGNAL(mouseEvent(QMouseEvent*)), this, SLOT(moveslider(QMouseEvent*)));
}


Slider1::~Slider1()
{


}


void Slider1::moveslider(QMouseEvent *event)
{
QWidget *widget = qobject_cast<QWidget*>(sender());
int leftPosX, rightPosX, redleftPosX_y, redrightPosX_y;
leftPosX = ui.sliderLeft->pos().x();             //左
rightPosX = ui.sliderRight->pos().x();           //右


redleftPosX_y = ui.redsliderLeft->pos().x();     //红左
redrightPosX_y = ui.redsliderRight->pos().x();   //红右
if (event->type() == QEvent::MouseMove)
{
//移动状态
if (leftPosX + 20 >redleftPosX_y)
{
ui.redsliderLeft->move(leftPosX + 20, 100);
}
else
{
//设置右滑条移动的范围
ui.sliderLeft->setLimitMinValue(0);
ui.sliderLeft->setLimitMaxValue(redrightPosX_y - 20 - 20);
//设置红左滑条移动的范围
ui.redsliderLeft->setLimitMinValue(leftPosX + 20);
ui.redsliderLeft->setLimitMaxValue(redrightPosX_y - 20);
}
if (rightPosX - 20 < redrightPosX_y)
{
ui.redsliderRight->move(rightPosX - 20, 100);
}
else
{
//设置左滑条移动的范围
ui.sliderRight->setLimitMinValue(redleftPosX_y + 20 + 20);
ui.sliderRight->setLimitMaxValue(600 - 20);
//设置红右滑条移动的范围
ui.redsliderRight->setLimitMaxValue(rightPosX - 20);
ui.redsliderRight->setLimitMinValue(redleftPosX_y + 20);
}
}
}

0 0
原创粉丝点击