⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 attitude_indicator.cpp

📁 This a framework to test new ideas in transmission technology. Actual development is a LDPC-coder in
💻 CPP
字号:
#include <qpainter.h>#include <qwt_math.h>#include "attitude_indicator.h"AttitudeIndicatorNeedle::AttitudeIndicatorNeedle(const QColor &c){    QPalette palette;    for ( int i = 0; i < QPalette::NColorGroups; i++ )    {        palette.setColor((QPalette::ColorGroup)i,            QColorGroup::Text, c);    }    setPalette(palette);}void AttitudeIndicatorNeedle::draw(QPainter *painter, const QPoint &center,    int length, double direction, QPalette::ColorGroup cg) const{    direction *= M_PI / 180.0;    int triangleSize = qRound(length * 0.1);    painter->save();    const QPoint p0(QPoint(center.x() + 1, center.y() + 1));    const QPoint p1 = qwtPolar2Pos(p0,        length - 2 * triangleSize - 2, direction);    QPointArray pa(3);    pa.setPoint(0, qwtPolar2Pos(p1, 2 * triangleSize, direction));    pa.setPoint(1, qwtPolar2Pos(p1, triangleSize, direction + M_PI_2));    pa.setPoint(2, qwtPolar2Pos(p1, triangleSize, direction - M_PI_2));    painter->setBrush(colorGroup(cg).text());    painter->drawPolygon(pa);    painter->setPen(QPen(colorGroup(cg).text(), 3));    painter->drawLine(qwtPolar2Pos(p0, length - 2, direction + M_PI_2),        qwtPolar2Pos(p0, length - 2, direction - M_PI_2));    painter->restore();}AttitudeIndicator::AttitudeIndicator(        QWidget *parent, const char *name):    QwtDial(parent, name),    d_gradient(0.0){    setMode(RotateScale);    setWrapping(TRUE);    setOrigin(270.0);    setScaleOptions(ScaleTicks);    setScale(0, 0, 30.0);    setNeedle(new AttitudeIndicatorNeedle(colorGroup().text()));}void AttitudeIndicator::setGradient(double gradient){    if ( gradient < -1.0 )         gradient = -1.0;    else if ( gradient > 1.0 )        gradient = 1.0;    if ( d_gradient != gradient )    {        d_gradient = gradient;        update();    }}void AttitudeIndicator::drawScale(QPainter *painter, const QPoint &center,    int radius, double origin, double minArc, double maxArc) const{    double dir = (360.0 - origin) * M_PI / 180.0; // counter clockwise, radian    int offset = 4;        const QPoint p0 = qwtPolar2Pos(center, offset, dir + M_PI);    const int w = contentsRect().width();    QPointArray pa(4);    pa.setPoint(0, qwtPolar2Pos(p0, w, dir - M_PI_2));    pa.setPoint(1, qwtPolar2Pos(pa.point(0), 2 * w, dir + M_PI_2));    pa.setPoint(2, qwtPolar2Pos(pa.point(1), w, dir));    pa.setPoint(3, qwtPolar2Pos(pa.point(2), 2 * w, dir - M_PI_2));    painter->save();    painter->setClipRegion(pa); // swallow 180 - 360 degrees    QwtDial::drawScale(painter, center, radius, origin,        minArc, maxArc);    painter->restore();}void AttitudeIndicator::drawScaleContents(QPainter *painter,    const QPoint &, int) const{    int dir = 360 - qRound(origin() - value()); // counter clockwise    int arc = 90 + qRound(gradient() * 90);    const QColor skyColor(38, 151, 221);    painter->save();    painter->setBrush(skyColor);    painter->drawChord(scaleContentsRect(),         (dir - arc) * 16, 2 * arc * 16 );     painter->restore();}void AttitudeIndicator::keyPressEvent(QKeyEvent *e){    switch(e->key())    {        case Key_Plus:            setGradient(gradient() + 0.05);            break;                    case Key_Minus:            setGradient(gradient() - 0.05);            break;        default:            QwtDial::keyPressEvent(e);    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -