自定义滑条
This commit is contained in:
parent
a9e20e87fd
commit
300e4efc5f
|
@ -0,0 +1,11 @@
|
|||
#include "widget.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
Widget w;
|
||||
w.show();
|
||||
return a.exec();
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
#include "widget.h"
|
||||
#include "ui_widget.h"
|
||||
|
||||
Widget::Widget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, ui(new Ui::Widget)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
}
|
||||
|
||||
Widget::~Widget()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
#ifndef WIDGET_H
|
||||
#define WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
namespace Ui { class Widget; }
|
||||
QT_END_NAMESPACE
|
||||
|
||||
class Widget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Widget(QWidget *parent = nullptr);
|
||||
~Widget();
|
||||
|
||||
private:
|
||||
Ui::Widget *ui;
|
||||
};
|
||||
#endif // WIDGET_H
|
|
@ -0,0 +1,35 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Widget</class>
|
||||
<widget class="QWidget" name="Widget">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>223</width>
|
||||
<height>40</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Widget</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="XSlider" name="horizontalSlider">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>XSlider</class>
|
||||
<extends>QSlider</extends>
|
||||
<header>xslider.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
|
@ -0,0 +1,188 @@
|
|||
#include "xslider.h"
|
||||
#include <QStyleOptionSlider>
|
||||
|
||||
XSlider::XSlider(QWidget *parent)
|
||||
{
|
||||
initForm();
|
||||
initStyle();
|
||||
setValue(65);
|
||||
}
|
||||
|
||||
void XSlider::paintEvent(QPaintEvent *ev)
|
||||
{
|
||||
// 绘制父类
|
||||
QSlider::paintEvent(ev);
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setRenderHints(QPainter::Antialiasing);
|
||||
|
||||
QStyleOptionSlider opt;
|
||||
initStyleOption(&opt);
|
||||
QRect rect = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);
|
||||
|
||||
int x = rect.x();
|
||||
int y = rect.y();
|
||||
int width = rect.width();
|
||||
int height = rect.height();
|
||||
if (width < height) {
|
||||
width = height;
|
||||
}
|
||||
else {
|
||||
height = width;
|
||||
}
|
||||
|
||||
QFont font;
|
||||
font.setPixelSize(width / 2);
|
||||
painter.setFont(font);
|
||||
painter.drawText(x, y, width, height, Qt::AlignCenter, QString::number(value()));
|
||||
}
|
||||
|
||||
void XSlider::mousePressEvent(QMouseEvent *ev)
|
||||
{
|
||||
if (ev->button() & Qt::RightButton) {
|
||||
return;
|
||||
}
|
||||
|
||||
double pos, value;
|
||||
if (orientation() == Qt::Horizontal) {
|
||||
pos = ev->pos().x() / (double)width();
|
||||
value = pos * (maximum() - minimum()) + minimum();
|
||||
}
|
||||
else {
|
||||
pos = ev->pos().y() / (double)height();
|
||||
value = maximum() - pos * (maximum() - minimum()) + minimum();
|
||||
}
|
||||
|
||||
setValue(value + 0.5);
|
||||
|
||||
emit clicked();
|
||||
QSlider::mousePressEvent(ev);
|
||||
}
|
||||
|
||||
void XSlider::initForm()
|
||||
{
|
||||
sliderHeight = 18;
|
||||
normalColor = QColor("#A0D7DA");
|
||||
grooveColor = QColor("#22A3A9");
|
||||
handleBorderColor = QColor("#0E99A0");
|
||||
handleColor = QColor("#FFFFFF");
|
||||
textColor = QColor("#000000");
|
||||
|
||||
this->setOrientation(Qt::Horizontal);
|
||||
}
|
||||
|
||||
void XSlider::initStyle()
|
||||
{
|
||||
int sliderRadius = sliderHeight / 2;
|
||||
int handleSize = (sliderHeight * 3) / 2 + (sliderHeight / 5);
|
||||
int handleRadius = handleSize / 2;
|
||||
int handleOffset = handleRadius / 2;
|
||||
|
||||
QStringList list;
|
||||
int handleWidth = handleSize + sliderHeight / 5 - 1;
|
||||
list.append(QString("QSlider::horizontal{min-height:%1px;color:%2;}").arg(sliderHeight * 2).arg(textColor.name()));
|
||||
list.append(QString("QSlider::groove:horizontal{background:%1;height:%2px;border-radius:%3px;}")
|
||||
.arg(normalColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::add-page:horizontal{background:%1;height:%2px;border-radius:%3px;}")
|
||||
.arg(normalColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::sub-page:horizontal{background:%1;height:%2px;border-radius:%3px;}")
|
||||
.arg(grooveColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::handle:horizontal{width:%3px;margin-top:-%4px;margin-bottom:-%4px;border-radius:%5px;"
|
||||
"background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.8 %1,stop:0.9 %2);}")
|
||||
.arg(handleColor.name()).arg(handleBorderColor.name()).arg(handleWidth).arg(handleOffset).arg(handleRadius));
|
||||
|
||||
//偏移一个像素
|
||||
handleWidth = handleSize + sliderHeight / 5;
|
||||
list.append(QString("QSlider::vertical{min-width:%1px;color:%2;}").arg(sliderHeight * 2).arg(textColor.name()));
|
||||
list.append(QString("QSlider::groove:vertical{background:%1;width:%2px;border-radius:%3px;}")
|
||||
.arg(normalColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::add-page:vertical{background:%1;width:%2px;border-radius:%3px;}")
|
||||
.arg(grooveColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::sub-page:vertical{background:%1;width:%2px;border-radius:%3px;}")
|
||||
.arg(normalColor.name()).arg(sliderHeight).arg(sliderRadius));
|
||||
list.append(QString("QSlider::handle:vertical{height:%3px;margin-left:-%4px;margin-right:-%4px;border-radius:%5px;"
|
||||
"background:qradialgradient(spread:pad,cx:0.5,cy:0.5,radius:0.5,fx:0.5,fy:0.5,stop:0.8 %1,stop:0.9 %2);}")
|
||||
.arg(handleColor.name()).arg(handleBorderColor.name()).arg(handleWidth).arg(handleOffset).arg(handleRadius));
|
||||
|
||||
|
||||
QString qss = list.join("");
|
||||
this->setStyleSheet(qss);
|
||||
}
|
||||
|
||||
int XSlider::getSliderHeight()
|
||||
{
|
||||
return this->sliderHeight;
|
||||
}
|
||||
|
||||
QColor XSlider::getNormalColor()
|
||||
{
|
||||
return this->normalColor;
|
||||
}
|
||||
|
||||
QColor XSlider::getGrooveColor()
|
||||
{
|
||||
return this->grooveColor;
|
||||
}
|
||||
|
||||
QColor XSlider::getHandleBorderColor()
|
||||
{
|
||||
return this->handleBorderColor;
|
||||
}
|
||||
|
||||
QColor XSlider::getHandleColor()
|
||||
{
|
||||
return this->handleColor;
|
||||
}
|
||||
|
||||
QColor XSlider::getTextColor()
|
||||
{
|
||||
return textColor;
|
||||
}
|
||||
|
||||
void XSlider::setSliderHeight(int &sliderHeight)
|
||||
{
|
||||
if (this->sliderHeight != sliderHeight) {
|
||||
this->sliderHeight = sliderHeight;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
||||
|
||||
void XSlider::setNormalColor(QColor &normalColor)
|
||||
{
|
||||
if (this->normalColor != normalColor) {
|
||||
this->normalColor = normalColor;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
||||
|
||||
void XSlider::setGrooveColor(QColor &grooveColor)
|
||||
{
|
||||
if (this->grooveColor != grooveColor) {
|
||||
this->grooveColor = grooveColor;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
||||
|
||||
void XSlider::setHandleBorderColor(QColor &handleBorderColor)
|
||||
{
|
||||
if (this->handleBorderColor != handleBorderColor) {
|
||||
this->handleBorderColor = handleBorderColor;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
||||
|
||||
void XSlider::setHandleColor(QColor &handleColor)
|
||||
{
|
||||
if (this->handleColor != handleColor) {
|
||||
this->handleColor = handleColor;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
||||
|
||||
void XSlider::setTextColor(QColor &textColor)
|
||||
{
|
||||
if (this->textColor != textColor) {
|
||||
this->textColor = textColor;
|
||||
this->initStyle();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
#ifndef XSLIDER_H
|
||||
#define XSLIDER_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <QSlider>
|
||||
#include <QPainter>
|
||||
#include <QMouseEvent>
|
||||
|
||||
class XSlider : public QSlider
|
||||
{
|
||||
Q_OBJECT
|
||||
// Q_PROPERTY(int sliderHeight READ getSliderHeight WRITE setSliderHeight);
|
||||
// Q_PROPERTY(QColor normalColor READ getNormalColor WRITE setNormalColor);
|
||||
// Q_PROPERTY(QColor grooveColor READ getGrooveColor WRITE setGrooveColor);
|
||||
// Q_PROPERTY(QColor handleBorderColor READ getHandleBorderColor WRITE setHandleBorderColor);
|
||||
// Q_PROPERTY(QColor handleColor READ getHandleColor WRITE setHandleColor);
|
||||
// Q_PROPERTY(QColor textColor READ getTextColor WRITE setTextColor);
|
||||
public:
|
||||
explicit XSlider(QWidget* parent = nullptr);
|
||||
|
||||
protected:
|
||||
void paintEvent(QPaintEvent *ev) override;
|
||||
void mousePressEvent(QMouseEvent* ev) override;
|
||||
|
||||
private:
|
||||
int sliderHeight;
|
||||
QColor normalColor;
|
||||
QColor grooveColor;
|
||||
QColor handleBorderColor;
|
||||
QColor handleColor;
|
||||
QColor textColor;
|
||||
|
||||
private slots:
|
||||
void initForm();
|
||||
void initStyle();
|
||||
|
||||
public:
|
||||
int getSliderHeight();
|
||||
QColor getNormalColor();
|
||||
QColor getGrooveColor();
|
||||
QColor getHandleBorderColor();
|
||||
QColor getHandleColor();
|
||||
QColor getTextColor();
|
||||
|
||||
private:
|
||||
void setSliderHeight(int& sliderHeight);
|
||||
void setNormalColor(QColor& normalColor);
|
||||
void setGrooveColor(QColor& grooveColor);
|
||||
void setHandleBorderColor(QColor& handleBorderColor);
|
||||
void setHandleColor(QColor& handleColor);
|
||||
void setTextColor(QColor& textColor);
|
||||
|
||||
Q_SIGNALS:
|
||||
void clicked();
|
||||
};
|
||||
|
||||
#endif // XSLIDER_H
|
|
@ -0,0 +1,33 @@
|
|||
QT += core gui
|
||||
|
||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||
|
||||
CONFIG += c++11
|
||||
|
||||
# The following define makes your compiler emit warnings if you use
|
||||
# any Qt feature that has been marked deprecated (the exact warnings
|
||||
# depend on your compiler). Please consult the documentation of the
|
||||
# deprecated API in order to know how to port your code away from it.
|
||||
DEFINES += QT_DEPRECATED_WARNINGS
|
||||
|
||||
# You can also make your code fail to compile if it uses deprecated APIs.
|
||||
# In order to do so, uncomment the following line.
|
||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||
|
||||
SOURCES += \
|
||||
main.cpp \
|
||||
widget.cpp \
|
||||
xslider.cpp
|
||||
|
||||
HEADERS += \
|
||||
widget.h \
|
||||
xslider.h
|
||||
|
||||
FORMS += \
|
||||
widget.ui
|
||||
|
||||
# Default rules for deployment.
|
||||
qnx: target.path = /tmp/$${TARGET}/bin
|
||||
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||
!isEmpty(target.path): INSTALLS += target
|
Loading…
Reference in New Issue