指南针是一种用来确定方向的工具。它由一个磁针制成,其一端被磁化,可以自由旋转。当放置在水平面上时,磁针会指向地球的磁北极。通过观察磁针的指向,我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针,通过继承QWidget类,并重写其paintEvent函数来实现。并对仪表盘绘制举行封装。
一、简述
这个示例创建了一个名为CompassWidget的自定义小部件,它继承自QWidget类。在paintEvent()函数中,我们利用QPainter类举行绘图操纵。
二、 计划思绪
- 创建一个QWidget子类CompassWidget用于绘制指南针。
- 在CompassWidget的构造函数中,设置指南针的配景色、大小等属性。
- 定义QcGaugeWidget类,绘制指南针的各个构成部分,重写干系部件的paintEvent()函数。
- 利用QPainter在paintEvent()函数中绘制指南针的主体部分,包括圆形配景、指针和刻度。
- 根据指南针的当前角度,盘算并绘制指针的位置和角度。
- 添加一个public的setCurrentValue()函数,用于设置指南针的角度,并在此中调用update()函数刷新界面。
三、结果
四、核心代码
1、头文件
compasswidget.h 指南针表盘控件
- #ifndef COMPASSWIDGET_H
- #define COMPASSWIDGET_H
- #include <QWidget>
- class QcGaugeWidget;
- class QcNeedleItem;
- class QVBoxLayout;
- class CompassWidget : public QWidget
- {
- Q_OBJECT
- public:
- explicit CompassWidget(QWidget *parent = 0);
- ~CompassWidget();
- public slots:
- void setCurrentValue(int value);
- private:
- void init();
- private:
- QcGaugeWidget *m_pCompassGauge; //表盘
- QcNeedleItem *m_pCompassNeedle; //指针
- QVBoxLayout *m_pMainLayout;
- };
- #endif // COMPASSWIDGET_H
复制代码 qcgaugewidget.h 仪表盘绘制封装(此处只有绘制指南针所需代码,全部代码请下载)
- #ifndef QCGAUGEWIDGET_H
- #define QCGAUGEWIDGET_H
- #include <QWidget>
- #include <QPainter>
- #include <QObject>
- #include <QRectF>
- #include <QtMath>
- class QcGaugeWidget;
- class QcItem;
- class QcBackgroundItem;
- class QcDegreesItem;
- class QcNeedleItem;
- class QcLabelItem;
- class QcGlassItem;
- ///
- class QcGaugeWidget : public QWidget
- {
- Q_OBJECT
- public:
- explicit QcGaugeWidget(QWidget *parent = 0);
- QcBackgroundItem* addBackground(float position);
- QcDegreesItem* addDegrees(float position);
- QcNeedleItem* addNeedle(float position);
- QcLabelItem* addLabel(float position);
- QcGlassItem* addGlass(float position);
- void addItem(QcItem* item, float position);
- int removeItem(QcItem* item);
- QList <QcItem*> items();
- QList <QcItem*> mItems;
- private:
- void paintEvent(QPaintEvent *);
- };
- ///
- class QcItem : public QObject
- {
- Q_OBJECT
- public:
- explicit QcItem(QObject *parent = 0);
- virtual void draw(QPainter *) = 0;
- virtual int type();
- void setPosition(float percentage);
- float position();
- QRectF rect();
- enum Error{InvalidValueRange,InvalidDegreeRange,InvalidStep};
- protected:
- QRectF adjustRect(float percentage);
- float getRadius(const QRectF &);
- float getAngle(const QPointF&, const QRectF &tmpRect);
- QPointF getPoint(float deg, const QRectF &tmpRect);
- QRectF resetRect();
- void update();
- private:
- QRectF mRect;
- QWidget *parentWidget;
- float mPosition;
- };
- ///
- class QcScaleItem : public QcItem
- {
- Q_OBJECT
- public:
- explicit QcScaleItem(QObject *parent = 0);
- void setValueRange(float minValue,float maxValue);
- void setDgereeRange(float minDegree,float maxDegree);
- void setMinValue(float minValue);
- void setMaxValue(float maxValue);
- void setMinDegree(float minDegree);
- void setMaxDegree(float maxDegree);
- protected:
- float getDegFromValue(float);
- float mMinValue;
- float mMaxValue;
- float mMinDegree;
- float mMaxDegree;
- };
- ///
- class QcBackgroundItem : public QcItem
- {
- Q_OBJECT
- public:
- explicit QcBackgroundItem(QObject *parent = 0);
- void draw(QPainter*);
- void addColor(float position, const QColor& color);
- void clearrColors();
- private:
- QPen mPen;
- QList<QPair<float,QColor> > mColors;
- QLinearGradient mLinearGrad;
- };
- ///
- class QcGlassItem : public QcItem
- {
- Q_OBJECT
- public:
- explicit QcGlassItem(QObject *parent = 0);
- void draw(QPainter*);
- };
- ///
- class QcLabelItem : public QcItem
- {
- Q_OBJECT
- public:
- explicit QcLabelItem(QObject *parent = 0);
- virtual void draw(QPainter *);
- void setAngle(float);
- float angle();
- void setText(const QString &text, bool repaint = true);
- QString text();
- void setColor(const QColor& color);
- QColor color();
- private:
- float mAngle;
- QString mText;
- QColor mColor;
- };
- ///
- class QcDegreesItem : public QcScaleItem
- {
- Q_OBJECT
- public:
- explicit QcDegreesItem(QObject *parent = 0);
- void draw(QPainter *painter);
- void setStep(float step);
- void setColor(const QColor& color);
- void setSubDegree(bool );
- private:
- float mStep;
- QColor mColor;
- bool mSubDegree;
- };
- ///
- class QcNeedleItem : public QcScaleItem
- {
- Q_OBJECT
- public:
- explicit QcNeedleItem(QObject *parent = 0);
- void draw(QPainter*);
- void setCurrentValue(float value);
- float currentValue();
- void setValueFormat(QString format);
- QString currentValueFormat();
- void setColor(const QColor & color);
- QColor color();
- void setLabel(QcLabelItem*);
- QcLabelItem * label();
- enum NeedleType{
- DiamonNeedle,
- TriangleNeedle,//三角指针
- FeatherNeedle,
- AttitudeMeterNeedle,
- CompassNeedle //指南针
- };
- void setNeedle(QcNeedleItem::NeedleType needleType);
- private:
- QPolygonF mNeedlePoly;
- float mCurrentValue;
- QColor mColor;
- void createDiamonNeedle(float r);
- void createTriangleNeedle(float r);
- void createFeatherNeedle(float r);
- void createAttitudeNeedle(float r);
- void createCompassNeedle(float r);
- NeedleType mNeedleType;
- QcLabelItem *mLabel;
- QString mFormat;
- };
- #endif // QCGAUGEWIDGET_H
复制代码 2、实当代码
compasswidget.cpp
- #include "compasswidget.h"
- #include <QVBoxLayout>
- #include "qcgaugewidget.h"
- CompassWidget::CompassWidget(QWidget *parent)
- : QWidget(parent)
- {
- init();
- }
- CompassWidget::~CompassWidget()
- {
- }
- void CompassWidget::setCurrentValue(int value)
- {
- m_pCompassNeedle->setCurrentValue(value);
- }
- void CompassWidget::init()
- {
- m_pCompassGauge = new QcGaugeWidget;
- m_pCompassGauge->addBackground(99);
- QcBackgroundItem *bkg1 = m_pCompassGauge->addBackground(92);
- bkg1->clearrColors();
- bkg1->addColor(0.1,Qt::black);
- bkg1->addColor(1.0,Qt::white);
- QcBackgroundItem *bkg2 = m_pCompassGauge->addBackground(88);
- bkg2->clearrColors();
- bkg2->addColor(0.1,Qt::white);
- bkg2->addColor(1.0,Qt::black);
- QcLabelItem *w = m_pCompassGauge->addLabel(80);//标签
- w->setText("W");
- w->setAngle(0);
- w->setColor(Qt::white);
- QcLabelItem *n = m_pCompassGauge->addLabel(80);
- n->setText("N");
- n->setAngle(90);
- n->setColor(Qt::white);
- QcLabelItem *e = m_pCompassGauge->addLabel(80);
- e->setText("E");
- e->setAngle(180);
- e->setColor(Qt::white);
- QcLabelItem *s = m_pCompassGauge->addLabel(80);
- s->setText("S");
- s->setAngle(270);
- s->setColor(Qt::white);
- QcDegreesItem *deg = m_pCompassGauge->addDegrees(70);//刻度
- deg->setStep(5);
- deg->setMaxDegree(270);
- deg->setMinDegree(-75);
- deg->setColor(Qt::white);
- m_pCompassNeedle = m_pCompassGauge->addNeedle(60);//指针
- m_pCompassNeedle->setNeedle(QcNeedleItem::CompassNeedle);
- m_pCompassNeedle->setValueRange(0,360);
- m_pCompassNeedle->setMaxDegree(360);
- m_pCompassNeedle->setMinDegree(0);
- m_pCompassGauge->addBackground(7);
- m_pCompassGauge->addGlass(88);//毛玻璃
- m_pMainLayout = new QVBoxLayout(this);
- m_pMainLayout->addWidget(m_pCompassGauge);
- }
复制代码 qcgaugewidget.cpp 仪表盘绘制封装(此处只有绘制指南针所需代码,全部代码请下载)
- #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;
- }
- 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;
- }
- void QcGaugeWidget::addItem(QcItem *item,float position)
- {
- 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->fontMetrics();
- QSize sz = fMetrics.size( Qt::TextSingleLine, mText );
- QRectF txtRect(QPointF(0,0), sz );
- txtRect.moveCenter(txtCenter);
- painter->drawText( txtRect, Qt::TextSingleLine,mText );
- }
- void QcLabelItem::setAngle(float a)
- {
- mAngle = a;
- update();
- }
- float QcLabelItem::angle()
- {
- return mAngle;
- }
- void QcLabelItem::setText(const QString &text, bool repaint)
- {
- mText = text;
- if(repaint)
- update();
- }
- QString QcLabelItem::text()
- {
- return mText;
- }
- void QcLabelItem::setColor(const QColor &color)
- {
- mColor = color;
- update();
- }
- QColor QcLabelItem::color()
- {
- return mColor;
- }
- ///
- QcDegreesItem::QcDegreesItem(QObject *parent) :
- QcScaleItem(parent)
- {
- mStep = 10;
- mColor = Qt::black;
- mSubDegree = false;
- setPosition(90);
- }
- void QcDegreesItem::draw(QPainter *painter)
- {
- resetRect();
- QRectF tmpRect = adjustRect(position());
- painter->setPen(mColor);
- float r = getRadius(tmpRect);
- for(float val = mMinValue;val<=mMaxValue;val+=mStep){
- float deg = getDegFromValue(val);
- QPointF pt = getPoint(deg,tmpRect);
- QPainterPath path;
- path.moveTo(pt);
- path.lineTo(tmpRect.center());
- pt = path.pointAtPercent(0.03);
- QPointF newPt = path.pointAtPercent(0.13);
- QPen pen;
- pen.setColor(mColor);
- if(!mSubDegree)
- pen.setWidthF(r/25.0);
- painter->setPen(pen);
- painter->drawLine(pt,newPt);
- }
- }
- void QcDegreesItem::setStep(float step)
- {
- mStep = step;
- update();
- }
- void QcDegreesItem::setColor(const QColor& color)
- {
- mColor = color;
- update();
- }
- void QcDegreesItem::setSubDegree(bool b)
- {
- mSubDegree = b;
- update();
- }
- ///
- QcNeedleItem::QcNeedleItem(QObject *parent) :
- QcScaleItem(parent)
- {
- mCurrentValue = 0;
- mColor = Qt::black;
- mLabel = NULL;
- mNeedleType = FeatherNeedle;
- }
- void QcNeedleItem::draw(QPainter *painter)
- {
- resetRect();
- QRectF tmpRect = adjustRect(position());
- painter->save();
- painter->translate(tmpRect.center());
- float deg = getDegFromValue( mCurrentValue);
- painter->rotate(deg+90.0);
- painter->setBrush(QBrush(mColor));
- painter->setPen(Qt::NoPen);
- QLinearGradient grad;
- switch (mNeedleType) {
- case QcNeedleItem::FeatherNeedle:
- createFeatherNeedle(getRadius(tmpRect));
- break;
- case QcNeedleItem::DiamonNeedle:
- createDiamonNeedle(getRadius(tmpRect));
- break;
- case QcNeedleItem::TriangleNeedle:
- createTriangleNeedle(getRadius(tmpRect));
- break;
- case QcNeedleItem::AttitudeMeterNeedle:
- createAttitudeNeedle(getRadius(tmpRect));
- break;
- case QcNeedleItem::CompassNeedle:
- createCompassNeedle(getRadius(tmpRect));
- grad.setStart(mNeedlePoly[0]);
- grad.setFinalStop(mNeedlePoly[1]);
- grad.setColorAt(0.9,Qt::red);
- grad.setColorAt(1,Qt::blue);
- painter->setBrush(grad);
- break;
- default:
- break;
- }
- painter->drawConvexPolygon(mNeedlePoly);
- painter->restore();
- }
- void QcNeedleItem::setCurrentValue(float value)
- {
- if(value<mMinValue)
- mCurrentValue = mMinValue;
- else if(value>mMaxValue)
- mCurrentValue = mMaxValue;
- else
- mCurrentValue = value;
- if(mLabel!=0)
- mLabel->setText(QString::number(mCurrentValue),false);
- update();
- }
- float QcNeedleItem::currentValue()
- {
- return mCurrentValue;
- }
- void QcNeedleItem::setValueFormat(QString format){
- mFormat = format;
- update();
- }
- QString QcNeedleItem::currentValueFormat(){
- return mFormat;
- }
- void QcNeedleItem::setColor(const QColor &color)
- {
- mColor = color;
- update();
- }
- QColor QcNeedleItem::color()
- {
- return mColor;
- }
- void QcNeedleItem::setLabel(QcLabelItem *label)
- {
- mLabel = label;
- update();
- }
- QcLabelItem *QcNeedleItem::label()
- {
- return mLabel;
- }
- void QcNeedleItem::setNeedle(QcNeedleItem::NeedleType needleType)
- {
- mNeedleType = needleType;
- update();
- }
- void QcNeedleItem::createDiamonNeedle(float r)
- {
- QVector<QPointF> tmpPoints;
- tmpPoints.append(QPointF(0.0, 0.0));
- tmpPoints.append(QPointF(-r/20.0,r/20.0));
- tmpPoints.append(QPointF(0.0, r));
- tmpPoints.append(QPointF(r/20.0,r/20.0));
- mNeedlePoly = tmpPoints;
- }
- void QcNeedleItem::createTriangleNeedle(float r)
- {
- QVector<QPointF> tmpPoints;
- tmpPoints.append(QPointF(0.0, r));
- tmpPoints.append(QPointF(-r/40.0, 0.0));
- tmpPoints.append(QPointF(r/40.0,0.0));
- mNeedlePoly = tmpPoints;
- }
- void QcNeedleItem::createFeatherNeedle(float r)
- {
- QVector<QPointF> tmpPoints;
- tmpPoints.append(QPointF(0.0, r));
- tmpPoints.append(QPointF(-r/40.0, 0.0));
- tmpPoints.append(QPointF(-r/15.0, -r/5.0));
- tmpPoints.append(QPointF(r/15.0,-r/5));
- tmpPoints.append(QPointF(r/40.0,0.0));
- mNeedlePoly = tmpPoints;
- }
- void QcNeedleItem::createAttitudeNeedle(float r)
- {
- QVector<QPointF> tmpPoints;
- tmpPoints.append(QPointF(0.0, r));
- tmpPoints.append(QPointF(-r/20.0, 0.85*r));
- tmpPoints.append(QPointF(r/20.0,0.85*r));
- mNeedlePoly = tmpPoints;
- }
- void QcNeedleItem::createCompassNeedle(float r)
- {
- QVector<QPointF> tmpPoints;
- tmpPoints.append(QPointF(0.0, r));
- tmpPoints.append(QPointF(-r/15.0, 0.0));
- tmpPoints.append(QPointF(0.0, -r));
- tmpPoints.append(QPointF(r/15.0,0.0));
- mNeedlePoly = tmpPoints;
- }
复制代码 以上是Qt绘制指南针实当代码,在实际利用中,可以根据需要自定义动画文件和样式。
该自定义控件主要特点有:
1、纯QPaint绘制,不包括图片等文件;
2、多种自定义控制,非常机动;
3、能够自顺应大小,不需要手动调整;
需要留意的是,在利用QPainter时,需要机动运用QPainter的绘图函数和提供给用户的交互函数,并留意处置惩罚用户的交互操纵和组件的尺寸调整等问题。
五、利用示例
以下是一个简单的示例代码,演示了如何在Qt中利用此控件:
- #include "mainwindow.h"
- #include "compasswidget.h"
- #include <QSlider>
- #include <QHBoxLayout>
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- {
- CompassWidget *pCompassWidget = new CompassWidget(this);
- QSlider *slider = new QSlider(this);
- slider->setRange(0, 360);
- connect(slider, &QSlider::valueChanged, pCompassWidget, &CompassWidget::setCurrentValue);
- QWidget *widget = new QWidget(this);
- QHBoxLayout *layout = new QHBoxLayout(widget);
- layout->addWidget(pCompassWidget);
- layout->addWidget(slider);
- setCentralWidget(widget);
- resize(400, 400);
- }
- MainWindow::~MainWindow()
- {
- }
复制代码 总结一下,指南针的计划方法和流程如下:
1、绘制指南针的配景。可以利用QPainter的drawEllipse方法来绘制一个圆形配景,然后填充颜色。
2、绘制指南针的刻度。可以利用QPainter的drawLine方法绘制指南针的刻度线,通过循环来绘制全部的刻度。
3、绘制指南针的指针。可以利用QPainter的drawLine方法绘制指南针的指针线,通过盘算指针的角度来确定其位置。
4、绘制指南针的文字标签。可以利用QPainter的drawText方法绘制文字,并根据指南针的角度来确定文字标签的位置。
六、绘制一个速度表盘
我们利用QcGaugeWidget 将CompassWidget内init稍作修改即可实现一个速度仪表盘,代码如下(表盘和指针对象名称已修改):
- m_pSpeedGauge = new QcGaugeWidget(this);
- m_pSpeedGauge->addBackground(99);
- QcBackgroundItem *bkg1 = m_pSpeedGauge->addBackground(92);
- bkg1->clearrColors();
- bkg1->addColor(0.1,Qt::black);
- bkg1->addColor(1.0,Qt::white);
- QcBackgroundItem *bkg2 = m_pSpeedGauge->addBackground(88);
- bkg2->clearrColors();
- bkg2->addColor(0.1,Qt::gray);
- bkg2->addColor(1.0,Qt::darkGray);
- m_pSpeedGauge->addArc(55);
- m_pSpeedGauge->addDegrees(65)->setValueRange(0,80);
- m_pSpeedGauge->addColorBand(50);
- m_pSpeedGauge->addValues(80)->setValueRange(0,80);
- m_pSpeedGauge->addLabel(70)->setText("Km/h");
- QcLabelItem *lab = m_pSpeedGauge->addLabel(40);
- lab->setText("0");
- m_pSpeedNeedle = m_pSpeedGauge->addNeedle(60);
- m_pSpeedNeedle->setLabel(lab);
- m_pSpeedNeedle->setColor(Qt::white);
- m_pSpeedNeedle->setValueRange(0,80);
- m_pSpeedGauge->addBackground(7);
- m_pSpeedGauge->addGlass(88);
- m_pMainLayout = new QVBoxLayout(this);
- m_pMainLayout->addWidget(m_pSpeedGauge);
- setLayout(m_pMainLayout);
复制代码 结果如下:
谢谢您的关注和阅读。如果您还有其他问题或需要进一步的资助,请随时联系我。祝您一切顺利!
七、源代码下载
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |