首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

Qt绘制指南针(仪表盘绘制封装使用示例)

移动开发 11.15KB 37 需要积分: 1
立即下载

资源介绍:

本示例是在Qt中绘制一个指南针,通过继承QWidget类,并重写其paintEvent函数来实现。并对仪表盘绘制进行封装。
#include "qcgaugewidget.h" QcGaugeWidget::QcGaugeWidget(QWidget *parent) : QWidget(parent) { setMinimumSize(250,250); } QcBackgroundItem *QcGaugeWidget::addBackground(float position) { QcBackgroundItem * item = new QcBackgroundItem(this); item->setPosition(position); mItems.append(item); return item; } QcDegreesItem *QcGaugeWidget::addDegrees(float position) { QcDegreesItem * item = new QcDegreesItem(this); item->setPosition(position); mItems.append(item); return item; } QcValuesItem *QcGaugeWidget::addValues(float position) { QcValuesItem * item = new QcValuesItem(this); item->setPosition(position); mItems.append(item); return item; } QcArcItem *QcGaugeWidget::addArc(float position) { QcArcItem * item = new QcArcItem(this); item->setPosition(position); mItems.append(item); return item; } QcColorBand *QcGaugeWidget::addColorBand(float position) { QcColorBand * item = new QcColorBand(this); item->setPosition(position); mItems.append(item); return item; } QcNeedleItem *QcGaugeWidget::addNeedle(float position) { QcNeedleItem * item = new QcNeedleItem(this); item->setPosition(position); mItems.append(item); return item; } QcLabelItem *QcGaugeWidget::addLabel(float position) { QcLabelItem * item = new QcLabelItem(this); item->setPosition(position); mItems.append(item); return item; } QcGlassItem *QcGaugeWidget::addGlass(float position) { QcGlassItem * item = new QcGlassItem(this); item->setPosition(position); mItems.append(item); return item; } QcAttitudeMeter *QcGaugeWidget::addAttitudeMeter(float position) { QcAttitudeMeter * item = new QcAttitudeMeter(this); item->setPosition(position); mItems.append(item); return item; } void QcGaugeWidget::addItem(QcItem *item,float position) { // takes parentship of the item item->setParent(this); item->setPosition(position); mItems.append(item); } int QcGaugeWidget::removeItem(QcItem *item) { return mItems.removeAll(item); } QList QcGaugeWidget::items() { return mItems; } void QcGaugeWidget::paintEvent(QPaintEvent */*paintEvt*/) { QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); foreach (QcItem * item, mItems) { item->draw(&painter); } } /////////////////////////////////////////////////////////////////////////////////////////// QcItem::QcItem(QObject *parent) : QObject(parent) { parentWidget = qobject_cast(parent); mPosition = 50; } int QcItem::type() { return 50; } void QcItem::update() { parentWidget->update(); } float QcItem::position() { return mPosition; } QRectF QcItem::rect() { return mRect; } void QcItem::setPosition(float position) { if(position>100) mPosition = 100; else if(position<0) mPosition = 0; else mPosition = position; update(); } QRectF QcItem::adjustRect(float percentage) { float r = getRadius(mRect); float offset = r-(percentage*r)/100.0; QRectF tmpRect = mRect.adjusted(offset,offset,-offset,-offset); return tmpRect; } float QcItem::getRadius(const QRectF &tmpRect) { float r = 0; if(tmpRect.width()rect(); float r = getRadius(mRect); mRect.setWidth(2.0*r); mRect.setHeight(2.0*r); mRect.moveCenter(parentWidget->rect().center()); return mRect; } QPointF QcItem::getPoint(float deg,const QRectF &tmpRect) { float r = getRadius(tmpRect); float xx=cos(qDegreesToRadians(deg))*r; float yy=sin(qDegreesToRadians(deg))*r; QPointF pt; xx=tmpRect.center().x()-xx; yy=tmpRect.center().y()-yy; pt.setX(xx); pt.setY(yy); return pt; } float QcItem::getAngle(const QPointF&pt, const QRectF &tmpRect) { float xx=tmpRect.center().x()-pt.x(); float yy=tmpRect.center().y()-pt.y(); return qRadiansToDegrees( atan2(yy,xx)); } /////////////////////////////////////////////////////////////////////////////////////////// QcScaleItem::QcScaleItem(QObject *parent) : QcItem(parent) { mMinDegree = -45; mMaxDegree = 225; mMinValue = 0; mMaxValue = 100; } void QcScaleItem::setValueRange(float minValue, float maxValue) { if(!(minValuemMaxValue) throw (InvalidValueRange); mMinValue = minValue; update(); } void QcScaleItem::setMaxValue(float maxValue) { if(maxValuemMaxDegree) throw (InvalidDegreeRange); mMinDegree = minDegree; update(); } void QcScaleItem::setMaxDegree(float maxDegree) { if(maxDegreesetBrush(Qt::NoBrush); QLinearGradient linearGrad(tmpRect.topLeft(), tmpRect.bottomRight()); for(int i = 0;isetPen(mPen); painter->setBrush(linearGrad); painter->drawEllipse(adjustRect(position())); } void QcBackgroundItem::addColor(float position, const QColor &color) { if(position<0||position>1) return; QPair pair; pair.first = position; pair.second = color; mColors.append(pair); update(); } void QcBackgroundItem::clearrColors() { mColors.clear(); } /////////////////////////////////////////////////////////////////////////////////////////// QcGlassItem::QcGlassItem(QObject *parent) : QcItem(parent) { setPosition(88); } void QcGlassItem::draw(QPainter *painter) { resetRect(); QRectF tmpRect1 = adjustRect(position()); QRectF tmpRect2 = tmpRect1; float r = getRadius(tmpRect1); tmpRect2.setHeight(r/2.0); painter->setPen(Qt::NoPen); QColor clr1 = Qt::gray ; QColor clr2 = Qt::white; clr1.setAlphaF(0.2); clr2.setAlphaF(0.4); QLinearGradient linearGrad1(tmpRect1.topLeft(), tmpRect1.bottomRight()); linearGrad1.setColorAt(0.1, clr1); linearGrad1.setColorAt(0.5, clr2); painter->setBrush(linearGrad1); painter->drawPie(tmpRect1,0,16*180); tmpRect2.moveCenter(rect().center()); painter->drawPie(tmpRect2,0,-16*180); } /////////////////////////////////////////////////////////////////////////////////////////// QcLabelItem::QcLabelItem(QObject *parent) : QcItem(parent) { setPosition(50); mAngle = 270; mText = "%"; mColor = Qt::black; } void QcLabelItem::draw(QPainter *painter) { resetRect(); QRectF tmpRect = adjustRect(position()); float r = getRadius(rect()); QFont font("Meiryo UI", r/10.0, QFont::Bold); painter->setFont(font); painter->setPen(QPen(mColor)); QPointF txtCenter = getPoint(mAngle,tmpRect); QFontMetrics fMetrics = painter->fo

资源文件列表:

compassDemo.zip 大约有10个文件
  1. compassDemo/
  2. compassDemo/compassDemo.pro 748B
  3. compassDemo/compassDemo.pro.user 18.59KB
  4. compassDemo/compasswidget.cpp 1.79KB
  5. compassDemo/compasswidget.h 514B
  6. compassDemo/main.cpp 183B
  7. compassDemo/mainwindow.cpp 668B
  8. compassDemo/mainwindow.h 231B
  9. compassDemo/qcgaugewidget.cpp 23.17KB
  10. compassDemo/qcgaugewidget.h 6.96KB
0评论
提交 加载更多评论
其他资源 FB38000 V90总线伺服绝对值编码器校准 FB38000 V90总线伺服绝对值编码器回原
FB38000 V90总线伺服绝对值编码器校准 FB38000 V90总线伺服绝对值编码器回原 111报文 V90总线伺服绝对值编码器回原 EPOS实现V90总线伺服定位控制
FME模板提取照片pos
本人实用FME 2020.2 32位版本,该模板提供一个提取照片经纬度和拍摄时间的一个思路。
期末小作业-图书馆管理系统
很普通的的初学者se代码,考虑很多学生懒得写期末作业,或者想要改的更快,直接打包看就行,非常容易看懂,0基础也是直接能改。
基于Qt实现的redis客户端
基于Qt实现的redis客户端。速度刚刚
文件上传项目,里面包含JWT验证配置和Dapper配置信息
文件上传项目,里面包含JWT验证配置和Dapper配置信息
彩虹云商城源码内自带克隆密匙,可以一键克隆目标站点的商品数据,或者对接供货商渠道自由一键对接自己喜欢的商品
彩虹云商城作为市面上最常见的一款系统,以众多实用的功能出名,经历了市场的考验,可以说是一款非常出色的系统。以实用的功能种类多,系统小巧高并发轻运营而著称,哪怕是再低配置的主机搭建好后都可以运行,深受各站长的喜爱。 系统介绍(自动发卡是最基本的,这里就不介绍了) 源码内自带克隆密匙,可以一键克隆目标站点的商品数据,或者对接供货商渠道自由一键对接自己喜欢的商品(市面上80%的货源站系统都支持彩虹系统一键对接商品) 1.内置20套模板,可自由切换,演示站点为其中一款,支持手机+电脑双端访问; 2.源码开源无加密,可支持二次开发使用,无版权限制; 3.内置供货数据和对接站点,可一键克隆商品数据,也可自己上传,省时省力; 4.支持支付宝/微信官方接口、易支付、码支付等多种支付接口; 5.多功能管理后台,支持邮箱自动发送卡密,无需第三方发卡平台; 6.内置分站管理系统,支持前台自助无限制开通分站,可对接代理; 7.内置防 红接口,支持自定义接口地址 8.后台支持一件生成主站app,分站后台支持一键生成分站的专属app 9.支持QQ扫码登录,无需申请API接口等等...
小型WPF 框架,可以用作新手学习
小型WPF 框架,可以用作新手学习。
基于 .NET7 和 sqlsugar后台管理系统
基于 Vue3/TypeScript/NaiveUI 和 NET7 & Sqlsugar 开发的后台管理框架。采用最原生最简洁的方式来实现, 前端清新优雅高颜值,后端 结构清晰,优雅易懂,功能强大。直接手机端上完美的运行,一套代码三端俱全。