Qt自定义控件实现简易仪表盘
本文实例为大家分享了Qt自定义控件实现简易仪表盘的具体代码,供大家参考,具体内容如下
Qt自定义控件12:简易仪表盘(根据liudianwu大神的界面自己写的代码,建议去学习刘大神,会受益良多的)
先看效果图:
思路:画270度的圆弧,圆弧根据占比分为两种颜色,根据占比在圆弧上画出一个圆球作为标志,然后就是刻度线和刻度值。刻度线是根据坐标系旋转画出,刻度值是根据角度求出x,y坐标值构造出一个矩形画出刻度值(不要用坐标系旋转画刻度值,那样刻度值的角度也会旋转,写出的字不是正的,效果不好)。最后就是在中心画value。
关键代码:
voidCMPassrate5::paintEvent(QPaintEvent*event){
intwidth=this->width();
intheight=this->height();
intside=qMin(width,height);
QPainterpainter(this);
painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing);
painter.translate(width/2,height/2);
painter.scale(side/200.0,side/200.0);
drawE(&painter);
drawEPoint(&painter);
drawLine(&painter);
drawEText(&painter);
drawValue(&painter);
}
voidCMPassrate5::drawE(QPainter*painter){
QRectrect(-radius,-radius,2*radius,2*radius);
painter->save();
painter->setPen(Qt::NoPen);
QPainterPathpath;
QPainterPathsubPath;
QPainterPathoutPath;
QPainterPathoutPubPath;
outPath.arcTo(rect,-45,outRange);
outPubPath.addEllipse(rect.adjusted(side,side,-side,-side));
outPath-=outPubPath;
color.setAlpha(100);
painter->setBrush(color);
painter->drawPath(outPath);
path.arcTo(rect,-45+outRange,range);
subPath.addEllipse(rect.adjusted(4,4,-4,-4));
path-=subPath;
color.setAlpha(180);
painter->setBrush(color);
painter->drawPath(path);
painter->restore();
}
voidCMPassrate5::drawEPoint(QPainter*painter){
//圆球位置就在outRange尽头处
painter->save();
color.setAlpha(180);
painter->setPen(Qt::NoPen);
painter->setBrush(color);
floatx=(radius-side/2)*qCos((range+135)*3.14/180);
floaty=(radius-side/2)*qSin((range+135)*3.14/180);
qDebug()<<"x:"<drawEllipse(QPoint(x,y),side,side);
painter->restore();
}
voidCMPassrate5::drawLine(QPainter*painter){
painter->save();
painter->rotate(135);
color.setAlpha(100);
painter->setPen(color);
QLineline(QPoint(radius-side-lineLength,0),QPoint(radius-side,0));
for(inti=0;idrawLine(line);
painter->rotate(270.0/lineCount);
}
painter->restore();
}
voidCMPassrate5::drawEText(QPainter*painter){
painter->save();
//painter->rotate(135);
painter->setPen(Qt::black);
floattextRange=270.0/(textCount-1);
floatx,y;
for(inti=0;i<=10;i++){
x=(radius-side-lineLength)*qCos((textRange*i+135)*3.14/180);
y=(radius-side-lineLength)*qSin((textRange*i+135)*3.14/180);
if(i<5){
QRectrect(x,y-4,20,10);
painter->drawText(rect,Qt::AlignCenter,QString::number(i*10));
}elseif(i==5){
QRectrect(x-7,y,20,10);
painter->drawText(rect,Qt::AlignCenter,QString::number(i*10));
}else{
QRectrect(x-20,y-5,20,10);
painter->drawText(rect,Qt::AlignCenter,QString::number(i*10));
}
}
painter->restore();
}
voidCMPassrate5::drawValue(QPainter*painter){
painter->save();
QPenpen=painter->pen();
pen.setColor(color);
pen.setWidth(2);
painter->setPen(pen);
QFontfont=painter->font();
font.setPixelSize(45);
painter->setFont(font);
QRectrect(-25,-25,50,50);
painter->drawText(rect,Qt::AlignCenter,QString::number(value));
painter->restore();
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。