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

u012959478需要积分:4(1积分=1元)

资源文件列表:

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

资源介绍:

本示例是在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<QcItem *> 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<QWidget*>(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()<tmpRect.height()) r = tmpRect.width()/2.0; else r = tmpRect.height()/2.0; return r; } QRectF QcItem::resetRect() { mRect = parentWidget->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(!(minValue<maxValue)) throw( InvalidValueRange); mMinValue = minValue; mMaxValue = maxValue; } void QcScaleItem::setDgereeRange(float minDegree, float maxDegree) { if(!(minDegree<maxDegree)) throw( InvalidValueRange); mMinDegree = minDegree; mMaxDegree = maxDegree; } float QcScaleItem::getDegFromValue(float v) { float a = (mMaxDegree-mMinDegree)/(mMaxValue-mMinValue); float b = -a*mMinValue+mMinDegree; return a*v+b; } void QcScaleItem::setMinValue(float minValue) { if(minValue>mMaxValue) throw (InvalidValueRange); mMinValue = minValue; update(); } void QcScaleItem::setMaxValue(float maxValue) { if(maxValue<mMinValue ) throw (InvalidValueRange); mMaxValue = maxValue; update(); } void QcScaleItem::setMinDegree(float minDegree) { if(minDegree>mMaxDegree) throw (InvalidDegreeRange); mMinDegree = minDegree; update(); } void QcScaleItem::setMaxDegree(float maxDegree) { if(maxDegree<mMinDegree) throw (InvalidDegreeRange); mMaxDegree = maxDegree; update(); } /////////////////////////////////////////////////////////////////////////////////////////// QcBackgroundItem::QcBackgroundItem(QObject *parent) : QcItem(parent) { setPosition(88); mPen = Qt::NoPen; setPosition(88); addColor(0.4,Qt::darkGray); addColor(0.8,Qt::black); } void QcBackgroundItem::draw(QPainter* painter) { QRectF tmpRect = resetRect(); painter->setBrush(Qt::NoBrush); QLinearGradient linearGrad(tmpRect.topLeft(), tmpRect.bottomRight()); for(int i = 0;i<mColors.size();i++){ linearGrad.setColorAt(mColors[i].first,mColors[i].second); } painter->setPen(mPen); painter->setBrush(linearGrad); painter->drawEllipse(adjustRect(position())); } void QcBackgroundItem::addColor(float position, const QColor &color) { if(position<0||position>1) return; QPair<float,QColor> 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
100+评论
captcha
    类型标题大小时间
    ZIPFB38000 V90总线伺服绝对值编码器校准 FB38000 V90总线伺服绝对值编码器回原651.72KB9月前
    ZIPFME模板提取照片pos33.63KB9月前
    ZIP期末小作业-图书馆管理系统3.69KB9月前
    ZIP基于Qt实现的redis客户端23.78MB9月前
    ZIP文件上传项目,里面包含JWT验证配置和Dapper配置信息96MB9月前
    ZIP彩虹云商城源码内自带克隆密匙,可以一键克隆目标站点的商品数据,或者对接供货商渠道自由一键对接自己喜欢的商品18.35MB9月前
    ZIP小型WPF 框架,可以用作新手学习 7.59MB9月前
    ZIP基于 .NET7 和 sqlsugar后台管理系统19.87MB9月前