Qt 那些年自定义的控件--双锚点Slider


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);
}

 

HTML中实现锚点定位并具有滚动效果的方法有多种。一种常见的方法是使用CSS的scroll-behavior属性和a标签的href属性。首先,在CSS中设置scroll-behavior属性为smooth,这将使得滚动条在滚动时具有平滑的效果。然后,在a标签中的href属性中设置目标位置的id值,例如#section。当点击该链接时,页面将会平滑滚动到相应的目标位置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [HTML锚点定位+平滑滚动](https://blog.csdn.net/m0_64520392/article/details/128941349)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [微信小程序-scroll-view滚动到指定位置(类似锚点)](https://download.csdn.net/download/weixin_38601878/16213063)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [vue+导航锚点联动-滚动监听和点击平滑滚动跳转实例](https://download.csdn.net/download/weixin_38665822/13982520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值