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;i drawLine(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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。