Qt 那些年自定义的控件–无限旋钮

上关键代码


void EndlessKnob::mousePressEvent(QMouseEvent *event)
{
    mPressed = true;
    mStartPos = event->pos();
    mStartAngle = mEndAngle = mouse2Poision(event->pos());
    update();
}

void EndlessKnob::mouseReleaseEvent(QMouseEvent *event)
{
    mPressed = false;
    mEndAngle= mouse2Poision(event->pos());
    update();
	if (mBtnEnable)
		emit knobClicked();
}

void EndlessKnob::mouseMoveEvent(QMouseEvent *event)
{
    if(mPressed && !mBtnEnable)
    {
        mEndAngle = mouse2Poision(event->pos());
        int d = dir(mStartPos,event->pos());
        if(d > 0)
        {
            if(qAbs(mEndAngle -mStartAngle) > Interval)
                emit valueChanged(1);
        }
        else if(d < 0)
        {
            if(qAbs(mEndAngle-mStartAngle) > Interval)
                emit valueChanged(-1);
        }
        mStartPos = event->pos();
        mStartAngle = mEndAngle;
        update();
    }
}

void EndlessKnob::paintEvent(QPaintEvent *event)
{
    int width = this->width();
    int height = this->height();
    int side = qMin(width,height);
    QPainter painter(this);
    painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
    painter.translate(width / 2, height / 2);
    painter.scale(side / 200.0, side / 200.0);
    drawBorderCircle(&painter,side);
    drawCenterCircle(&painter,side);
	if(!mBtnEnable)
		drawPointer(&painter,side);
	if (!mText.isEmpty() && mBtnEnable)
		drawText(&painter);
}

void EndlessKnob::drawBorderCircle(QPainter *painter,int r)
{
    int radius = r;
    painter->save();
    painter->setPen(Qt::NoPen);
    QLinearGradient bgGradient(0, -radius, 0, radius);
    bgGradient.setColorAt(0.0, mBorderCircleCol1);
    bgGradient.setColorAt(1.0, mBorderCircleCol2);
    painter->setBrush(bgGradient);

    painter->drawEllipse(-radius, -radius, radius * 2, radius * 2);
    painter->restore();
}

void EndlessKnob::drawCenterCircle(QPainter *painter,int r)
{
    int radius1 = r/10*9;;
    painter->save();
    painter->setPen(Qt::NoPen);
    QLinearGradient bgGradient1(0, -radius1, 0, radius1);
    bgGradient1.setColorAt(0.0, mCenterCircleCol1);
    bgGradient1.setColorAt(1.0, mCenterCircleCol2);
    painter->setBrush(bgGradient1);
    painter->drawEllipse(-radius1, -radius1, radius1 * 2, radius1 * 2);
    painter->restore();
}

void EndlessKnob::drawPointer(QPainter *painter,int r)
{
    int radius = mPointerWidth;
    int offset = r/10*4;
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(QColor("#000000"));

    QPolygon pts;
    pts.setPoints(3, -radius / 2, offset, radius / 2, offset, 0, radius + offset);

    //painter->rotate(mStartAngle);
    double degRotate = mEndAngle;
    painter->rotate(degRotate);
    painter->drawConvexPolygon(pts);

    painter->restore();
}

void EndlessKnob::drawText(QPainter *painter)
{
	int radius = 100;
	painter->save();
	QFont font("Microsoft YaHei", mTextSize);
	painter->setPen(mTextColor);
	QFontMetrics fm(font);
	painter->setFont(font);
	QString text = fm.elidedText(mText, Qt::ElideRight, width());
	QRectF textRect(-radius, -radius, radius * 2, radius * 2);
	painter->drawText(textRect, Qt::AlignCenter, text);
	painter->restore();
}

 

有需要的留言,留下你的邮箱


版权声明:本文为qq_35083314原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>