void DapSlider::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
paintRunway(&painter);
if (m_bHover)
{
paintAnchor(&painter, mFirstPostion);
paintAnchor(&painter, mSecPostion, false);
}
}
void DapSlider::mousePressEvent(QMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
{
m_bLeftButtonPressed = true;
m_dragPosition = event->pos();
}
if(mFirPath.contains(event->pos()))
{
mPressedOffset = event->pos()-mFirPath.boundingRect().toRect().topLeft();
mFirPressed = true;
}
else if(mSecPath.contains(event->pos()))
{
mPressedOffset = event->pos()-mSecPath.boundingRect().toRect().topLeft();
mSecPressed = true;
}
return QWidget::mousePressEvent(event);
}
void DapSlider::mouseReleaseEvent(QMouseEvent *event)
{
m_bLeftButtonPressed = false;
mFirPressed = false;
mSecPressed = false;
this->update();
return QWidget::mouseReleaseEvent(event);
}
void DapSlider::mouseMoveEvent(QMouseEvent *event)
{
if(mFirPressed)
{
mFirstPostion = event->pos().x()-mPressedOffset.x()+mMargin;
if(mFirstPostion < mMargin)
mFirstPostion = mMargin;
else if(mFirstPostion > mSecPostion-mMargin)
mFirstPostion = mSecPostion-mMargin;
mFirstValue = (mFirstPostion-mMargin)/(qreal)(width()-mMargin*2)*(mMaxValue-mMinValue)+mMinValue;
emit firstValueChanged(mFirstValue);
update();
}
else if(mSecPressed)
{
mSecPostion = event->pos().x()-mPressedOffset.x()+mMargin;
if(mSecPostion > width()-mMargin)
mSecPostion = width()- mMargin;
else if(mSecPostion < mFirstPostion+mMargin)
mSecPostion = mFirstPostion+mMargin;
mSecondValue = (mSecPostion-mMargin)/(qreal)(width()-mMargin*2)*(mMaxValue-mMinValue)+mMinValue;
emit secondValueChanged(mSecondValue);
update();
}
else if (m_bLeftButtonPressed)
{
if (event->buttons() & Qt::LeftButton && (event->pos() - m_dragPosition).manhattanLength() >= QApplication::startDragDistance())
{
emit signalDargEvent();
}
}
return;
}
void DapSlider::resizeEvent(QResizeEvent *event)
{
SetValue(mValue);
SetFirstValue(mFirstValue);
SetSecondValue(mSecondValue);
return QWidget::resizeEvent(event);
}
void DapSlider::gradientRect(QPainter *painter, QPointF spos, QPointF send, QColor color)
{
QLinearGradient gradient(spos,send);
gradient.setColorAt(0,color);
gradient.setColorAt(1,color);
QBrush brush(gradient);
painter->setBrush(brush);
QRectF rect(spos,send);
painter->drawRect(rect);
}
void DapSlider::paintRunway(QPainter *painter)
{
gradientRect(painter,QPointF(mMargin,height()/5*4),QPointF(width()-mMargin,height()),mBackColor);
gradientRect(painter,QPointF(mFirstPostion,height()/5*4),QPointF(mProgress,height()),mProgressColor);
gradientRect(painter,QPointF(mMargin,height()/5*4),QPointF(mFirstPostion,height()),mTailorColor);
gradientRect(painter,QPointF(mSecPostion,height()/5*4),QPointF(width()-mMargin,height()),mTailorColor);
}
void DapSlider::paintAnchor(QPainter *painter, int postion, bool first)
{
mAnchorHeight = height() / 5 * 4;
QPainterPath path;
path.moveTo(postion - mAnchorWidth / 2, 7);
path.lineTo(postion + mAnchorWidth / 2, 7);
path.lineTo(postion, mAnchorHeight);
path.lineTo(postion - mAnchorWidth / 2, 7);
QTime time(0, 0, 0, 0);
QString sTime;
if (first)
{
sTime = time.addMSecs(mFirstValue).toString("hh:mm:ss");
mFirPath = path;
}
else
{
sTime = time.addMSecs(mSecondValue).toString("hh:mm:ss");
mSecPath = path;
}
if ((first && mFirPressed) || (!first && mSecPressed))
{
painter->fillPath(path, QBrush(mPressAnchorColor));
}
else
{
painter->fillPath(path, QBrush(mAnchorColor));
}
QFont font;
font.setPixelSize(mWordSize);
font.setFamily("Microsoft YaHei");
QFontMetrics mf(font);
int width = mf.width(sTime);
painter->setFont(font);
painter->setPen(mWordColor);
int wordPos;
if (postion < width / 2)
wordPos = width / 2 - postion;
else if (this->width() - postion < width / 2)
wordPos = this->width() - postion +(this->width()-width-mMargin*2);
else
wordPos = postion - width / 2;
painter->drawText(QPoint(wordPos, 7), sTime);
}