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 版权协议,转载请附上原文出处链接和本声明。