Qt自定义精美的仪表盘控件(汽车仪表、指南针、雷达、摇杆)
一、网速测速仪表盘
#include "Frm_GaugeSpeed.h" #include <QTimer> #include <QPainter> #include <QtMath> #include <QDebug> //QString qss1 = QString("QLabel{background-color:rgb(0,0,0);color:rgb(%1);}").arg("100,184,255"); //QString qss2 = QString("QLabel{background-color:rgb(0,0,0);color:rgb(%1);}").arg("255,107,107"); //QString qss3 = QString("QLabel{background-color:rgb(0,0,0);color:rgb(%1);}").arg("24,189,155"); //=================================================================================== // 函数名称 | Frm_GaugeSpeed() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_GaugeSpeed::Frm_GaugeSpeed(QWidget *parent) : QWidget(parent) { m_timer = new QTimer(this); m_timer->setInterval(1000); m_timer->start(); connect(m_timer, SIGNAL(timeout()), this, SLOT(slotAnimaValue())); if(this->m_isAnimation == true) { QTimer::singleShot(50, this, SLOT(slotUpdateValue())); } } //=================================================================================== // 函数名称 | ~Frm_GaugeSpeed() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_GaugeSpeed::~Frm_GaugeSpeed() { } //=================================================================================== // 函数名称 | drawScale() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 | 绘制刻度线 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_GaugeSpeed::drawScale(QPainter *painter) { int radius = 94; painter->save(); QPen pen; pen.setCapStyle(Qt::RoundCap); painter->rotate(m_IntSartAngle); int steps = (m_IntScaleMajor * m_IntScaleMinor); double angleStep = (360.0 - m_IntSartAngle - m_IntEndAngle) / steps; //计算圆环对应大刻度范围索引 int indexStart = steps * (double)m_IntRingStartPercent / 100 + 1; int indexMid = steps * (double)m_IntRingMidPercent / 100 - 1; int indexEnd = steps * (double)m_IntRingEndPercent / 100 + 1; int index = 0; for (int i = 0; i <= steps; i++) { if (i % m_IntScaleMinor == 0) { //根据所在圆环范围切换颜色 if (index < indexStart) { pen.setColor(m_ColorRingStart); } else if (index < (indexStart + indexMid)) { pen.setColor(m_ColorRingMid); } else if (index < (indexStart + indexMid + indexEnd)) { pen.setColor(m_ColorRingEnd); } index++; pen.setWidthF(1.5); painter->setPen(pen); painter->drawLine(0, radius - 13, 0, radius); } else { pen.setWidthF(0.5); pen.setColor(QColor(0,255,255)); painter->setPen(pen); painter->drawLine(0, radius - 5, 0, radius); } painter->rotate(angleStep); } painter->restore(); } //=================================================================================== // 函数名称 | drawPointer() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 | 绘制指针 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_GaugeSpeed::drawPointer(QPainter *painter) { int radius = 62; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(m_pointerColor); QPolygon pts; pts.setPoints(4, -5, 0, 0, -8, 5, 0, 0, radius); painter->rotate(m_IntSartAngle); double degRotate = (360.0 - m_IntSartAngle - m_IntEndAngle) / (m_dMaxValue - m_dMinValue) * (m_dCurrentValue - m_dMinValue); painter->rotate(degRotate); painter->drawConvexPolygon(pts); painter->restore(); } double Frm_GaugeSpeed::getMinValue() const { return this->m_dMinValue; } double Frm_GaugeSpeed::getMaxValue() const { return this->m_dMaxValue; } double Frm_GaugeSpeed::getValue() const { return this->m_dCurrentValue; } int Frm_GaugeSpeed::getPrecision() const { return this->m_IntPreciBit; } int Frm_GaugeSpeed::getScaleMajor() const { return this->m_IntScaleMajor; } int Frm_GaugeSpeed::getScaleMinor() const { return this->m_IntScaleMinor; } int Frm_GaugeSpeed::getStartAngle() const { return this->m_IntSartAngle; } int Frm_GaugeSpeed::getEndAngle() const { return this->m_IntEndAngle; } bool Frm_GaugeSpeed::getAnimation() const { return this->m_isAnimation; } double Frm_GaugeSpeed::getAnimationStep() const { return this->m_dAnimationStep; } int Frm_GaugeSpeed::getRingWidth() const { return this->m_IntRingWidth; } int Frm_GaugeSpeed::getRingStartPercent() const { return this->m_IntRingStartPercent; } int Frm_GaugeSpeed::getRingMidPercent() const { return this->m_IntRingMidPercent; } int Frm_GaugeSpeed::getRingEndPercent() const { return this->m_IntRingEndPercent; } QColor Frm_GaugeSpeed::getRingColorStart() const { return this->m_ColorRingStart; } QColor Frm_GaugeSpeed::getRingColorMid() const { return this->m_ColorRingMid; } QColor Frm_GaugeSpeed::getRingColorEnd() const { return this->m_ColorRingEnd; } QColor Frm_GaugeSpeed::getPointerColor() const { return this->m_pointerColor; } QColor Frm_GaugeSpeed::getTextColor() const { return this->m_textColor; } QSize Frm_GaugeSpeed::sizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } QSize Frm_GaugeSpeed::minimumSizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } void Frm_GaugeSpeed::setRange(double minValue, double maxValue) { this->m_dMinValue = minValue; this->m_dMaxValue = maxValue; } void Frm_GaugeSpeed::setRange(int minValue, int maxValue) { this->m_dMinValue = minValue; this->m_dMaxValue = maxValue; } void Frm_GaugeSpeed::setValue(double value) { this->m_dTargetValue = value; if(this->m_isAnimation == true) { QTimer::singleShot(5, this, SLOT(slotUpdateValue())); } else { this->m_dCurrentValue = this->m_dTargetValue; } update(); } void Frm_GaugeSpeed::setValue(int value) { this->m_dTargetValue =value; if(this->m_isAnimation == true) { QTimer::singleShot(5, this, SLOT(slotUpdateValue())); } else { this->m_dCurrentValue = this->m_dTargetValue; } update(); } void Frm_GaugeSpeed::setValue(QString &value) { this->m_dTargetValue = value.toDouble(); if(this->m_isAnimation == true) { QTimer::singleShot(5, this, SLOT(slotUpdateValue())); } else { this->m_dCurrentValue = this->m_dTargetValue; } update(); } void Frm_GaugeSpeed::setAnimation(bool animation) { this->m_isAnimation = animation; if(this->m_isAnimation == true) { QTimer::singleShot(5, this, SLOT(slotUpdateValue())); } } void Frm_GaugeSpeed::slotUpdateValue() { if(this->m_isAnimation == true) { if(fabs(m_dCurrentValue - m_dTargetValue) > 0.001) { if(m_dCurrentValue - m_dTargetValue > 0.001) m_dCurrentValue = m_dCurrentValue - m_dAnimationStep; else { m_dCurrentValue = m_dCurrentValue + m_dAnimationStep; } QTimer::singleShot(5, this, SLOT(slotUpdateValue())); update(); } } } //=================================================================================== // 函数名称 | slotAnimaValue() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 | 模拟计数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_GaugeSpeed::slotAnimaValue() { setValue(m_dCurrentValue+m_dAnimationStep); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365二、汽车仪表盘
#include "Frm_Dashboard.h" #include <QTimer> #include <QPainter> #include <QtMath> #include <QDebug> //=================================================================================== // 函数名称 | Frm_Dashboard() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Dashboard::Frm_Dashboard(QWidget *parent) : QWidget(parent) { m_timer = new QTimer(this); m_timer->setInterval(1000); m_timer->start(); connect(m_timer, SIGNAL(timeout()), this, SLOT(slotAnimaValue())); if(this->m_isAnimation == true) { QTimer::singleShot(50, this, SLOT(slotUpdateValue())); } } //=================================================================================== // 函数名称 | ~Frm_Dashboard() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Dashboard::~Frm_Dashboard() { } double Frm_Dashboard::getMinValue() const { return this->m_dMinValue; } double Frm_Dashboard::getMaxValue() const { return this->m_dMaxValue; } double Frm_Dashboard::getValue() const { return this->m_dCurrentValue; } int Frm_Dashboard::getPrecision() const { return this->m_IntPreciBit; } int Frm_Dashboard::getScaleMajor() const { return this->m_IntScaleMajor; } int Frm_Dashboard::getScaleMinor() const { return this->m_IntScaleMinor; } int Frm_Dashboard::getStartAngle() const { return this->m_IntSartAngle; } int Frm_Dashboard::getEndAngle() const { return this->m_IntEndAngle; } bool Frm_Dashboard::getAnimation() const { return this->m_isAnimation; } double Frm_Dashboard::getAnimationStep() const { return this->m_dAnimationStep; } QColor Frm_Dashboard::getPointerColor() const { return this->m_pointerColor; } QColor Frm_Dashboard::getTextColor() const { return this->m_textColor; } QSize Frm_Dashboard::sizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } QSize Frm_Dashboard::minimumSizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } //=================================================================================== // 函数名称 | paintEvent() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘制事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Dashboard::paintEvent(QPaintEvent *) { int width = this->width(); int height = this->height(); int side = qMin(width, height); QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);/*使用反锯齿(如果可用) */ painter.translate(width / 2, height / 2); /* 坐标变换为窗体中心 */ painter.scale(side / 200.0, side / 200.0); /* 比例缩放 */ drawRing(&painter); drawScale(&painter); drawScaleNum(&painter); drawOverlay(&painter); drawPointer(&painter); drawValue(&painter); } //=================================================================================== // 函数名称 | drawRing() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 | 绘制外围环 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Dashboard::drawRing(QPainter *painter) { int r = m_Radius; painter->save(); painter->setPen(Qt::NoPen); painter->setBrush(QColor(172, 172, 172));//外围 painter->drawEllipse(-r, -r, r * 2, r * 2); r = m_Radius * 0.9; painter->setBrush(QColor(0, 26, 51));//内圆 painter->setPen(Qt::NoPen); painter->drawEllipse(-r, -r, r * 2, r * 2); painter->restore(); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179三、指南针表盘
#include "Frm_Compass.h" #include <QTimer> #include <QPainter> #include <QtMath> #include <QDebug> //=================================================================================== // 函数名称 | Frm_Compass() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Compass::Frm_Compass(QWidget *parent) : QWidget(parent) { m_timer = new QTimer(this); m_timer->setInterval(1000); m_timer->start(); connect(m_timer, SIGNAL(timeout()), this, SLOT(slotAnimaValue())); if(this->m_isAnimation == true) { QTimer::singleShot(50, this, SLOT(slotUpdateValue())); } } //=================================================================================== // 函数名称 | ~Frm_Compass() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Compass::~Frm_Compass() { } double Frm_Compass::getValue() const { return this->m_dCurrentValue; } int Frm_Compass::getPrecision() const { return this->m_IntPreciBit; } bool Frm_Compass::getAnimation() const { return this->m_isAnimation; } double Frm_Compass::getAnimationStep() const { return this->m_dAnimationStep; } QColor Frm_Compass::getTextColor() const { return this->m_textColor; } QSize Frm_Compass::sizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } QSize Frm_Compass::minimumSizeHint() const { int width = this->width(); int height = this->height(); return QSize(qMin(width, height), qMin(width, height)); } //=================================================================================== // 函数名称 | paintEvent() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘制事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Compass::paintEvent(QPaintEvent *) { int width = this->width(); int height = this->height(); int side = qMin(width, height); //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //绘制外边框圆 drawRing(&painter); //绘制背景圆 drawBgCircle(&painter); //绘制刻度 drawScale(&painter); //绘制东南西北标识 drawScaleNum(&painter); //绘制覆盖圆外圆 drawCoverOuterCircle(&painter); //绘制覆盖圆内圆 drawCoverInnerCircle(&painter); //绘制覆盖圆中心圆 drawCoverCenterCircle(&painter); //绘制南北指针 drawPointer(&painter); //绘制中心圆 drawCenterCircle(&painter); //绘制当前值 drawValue(&painter); //绘制遮罩 drawOverlay(&painter); } //================================================================================================== //| 函数名称 | drawOverlay() //|------------------------------------------------------------------------------------------------- //| 函数功能 | 绘制遮罩层 //|------------------------------------------------------------------------------------------------- //| 输入参数 |painter画家 //|------------------------------------------------------------------------------------------------- //| 返回参数 | //|------------------------------------------------------------------------------------------------- //| 函数设计 | xt,2020.10.16 //================================================================================================== void Frm_Compass::drawOverlay(QPainter *painter) { int radius = 100; painter->save(); painter->setPen(Qt::NoPen); QPainterPath smallCircle; QPainterPath bigCircle; radius -= 1; smallCircle.addEllipse(-radius, -radius, radius * 2, radius * 2); radius *= 2; bigCircle.addEllipse(-radius, -radius + 140, radius * 2, radius * 2); //高光的形状为小圆扣掉大圆的部分 QPainterPath highlight = smallCircle - bigCircle; QLinearGradient linearGradient(0, -radius / 2, 0, 0); m_overlayColor.setAlpha(100); linearGradient.setColorAt(0.0, m_overlayColor); m_overlayColor.setAlpha(30); linearGradient.setColorAt(1.0, m_overlayColor); painter->setBrush(linearGradient); painter->rotate(-20); painter->drawPath(highlight); painter->restore(); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176四、钢铁侠雷达扫描
#include "Frm_Radar.h" #include <QPainter> #include <QPaintEvent> #include <QRadialGradient> #include <QDebug> #include <time.h> #include <ctime> //=================================================================================== // 函数名称 | Frm_Radar() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Radar::Frm_Radar(QWidget *parent) : QWidget(parent) { m_radarAreaRect = QRect(-m_uinRadius + 10, -m_uinRadius + 10,2 * (m_uinRadius - 10), 2 * (m_uinRadius - 10)); connect(&m_rotateTimer, &QTimer::timeout, this, &Frm_Radar::slotRotate); m_rotateTimer.setInterval(60); m_rotateTimer.start(); m_scaleFont.setFamily("微软雅黑"); m_scaleFont.setPixelSize(4); m_vecCheckPos = new std::vector<PosStruct>; m_vecCheckPos->reserve(10); } //=================================================================================== // 函数名称 | ~Frm_Radar() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Radar::~Frm_Radar() { } //=================================================================================== // 函数名称 | paintEvent() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘制事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Radar::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter(this); int side = qMin(width(), height()); int x = (width() - side) / 2; int y = (height() - side) / 2; // 设置ViewPort painter.setViewport(QRect(x, y, side, side)); // 设置窗口 逻辑坐标 painter.setWindow(QRect(-m_uinRadius, -m_uinRadius, 2 * m_uinRadius, 2 * m_uinRadius)); painter.setRenderHint(QPainter::Antialiasing); drawScale(painter); drawBackground(painter); drawScanArea(painter); for (auto item = m_vecCheckPos->begin(); item != m_vecCheckPos->end(); ++item) { drawPoint(painter, *item); } } //=================================================================================== // 函数名称 | drawScan() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘制雷达刻度线 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Radar::drawScale(QPainter &painter) { painter.save(); painter.setPen(QPen(QColor("#2252E1"), 0)); painter.setFont(m_scaleFont); qreal radius = m_uinRadius - 10; int value = 15; for(int i = 0; i < 24; i++) { painter.rotate(360 / 24); painter.drawText(QPoint(0, -radius - 4), value == 360 ? "0" : QString::number(value)); value += 15; } for(int i = 0; i < 120; i++) { painter.rotate(3);//旋转3° if(i % 5 == 0) painter.drawLine(QPoint(0, radius - 5), QPoint(0, radius)); else painter.drawLine(QPoint(0, radius - 2), QPoint(0, radius)); } painter.restore(); } //=================================================================================== // 函数名称 | drawBackground() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘画雷达区域背景 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Radar::drawBackground(QPainter &painter) { painter.save(); // 画螺旋环 painter.setBrush(Qt::NoBrush); painter.setPen(QPen(QColor("#29EE47"), 0)); painter.setCompositionMode(QPainter::CompositionMode_Multiply); for (unsigned int i = 0; i < m_uinRadius; i = i + 10) { painter.drawEllipse(QPoint(0, 0), i, i); } // 画背景 QRadialGradient radialGradient(QPoint(0, 0), m_uinRadius, QPoint(0, 0)); radialGradient.setColorAt(0, QColor("#1B47EA")); radialGradient.setColorAt(1, QColor("#2DE3E9")); painter.setBrush(radialGradient); painter.drawEllipse(m_radarAreaRect); painter.restore(); } //=================================================================================== // 函数名称 | drawScanArea() //----------------------------------------------------------------------------------- // 函数输入 |painter画家 //----------------------------------------------------------------------------------- // 函数功能 |绘制雷达扫描区域 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Radar::drawScanArea(QPainter &painter) { // 画扫描区域 painter.save(); painter.setCompositionMode(QPainter::CompositionMode_SourceOver); painter.rotate(m_fRotateAngle); QColor color_0("#47D72D"); color_0.setAlpha(200); QColor color_2("#47D72D"); color_2.setAlpha(0); //绘制扫描线 painter.setPen(QPen(color_0, 0)); painter.drawLine(QPoint(0, 0), QPoint(m_uinRadius - 10, 0)); //绘制扫描线拖尾 QConicalGradient scanAreaGradient(QPoint(0, 0), 0); scanAreaGradient.setColorAt(0.0, color_0); scanAreaGradient.setColorAt(1. / 360, color_0); scanAreaGradient.setColorAt(40. / 360, color_2); painter.setPen(Qt::NoPen); painter.setBrush(scanAreaGradient); painter.drawPie(m_radarAreaRect, 0, 40 * 16); painter.restore(); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191五、全方位雷达扫描
#include "Frm_ScanTanTan1.h" #include <QTimer> #include <QPainter> #include <QtMath> #include <QDebug> #include <QPropertyAnimation> #include <QSequentialAnimationGroup> //=================================================================================== // 函数名称 | Frm_ScanTanTan2() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_ScanTanTan1::Frm_ScanTanTan1(QWidget *parent) : QWidget(parent) { //监测点列表 m_vecCheckPos = new std::vector<PosStruct>; m_vecCheckPos->reserve(10); //加载图片 setImage(QPixmap("./Resources/image/IronMan2.jpeg")); //动画 QPropertyAnimation *anim1 = new QPropertyAnimation(this, ""); anim1->setStartValue(40); anim1->setEndValue(50); anim1->setDuration(300); QPropertyAnimation *anim2 = new QPropertyAnimation(this, ""); anim2->setStartValue(50); anim2->setEndValue(30); anim2->setDuration(300); QPropertyAnimation *anim3 = new QPropertyAnimation(this, ""); anim3->setStartValue(30); anim3->setEndValue(40); anim3->setDuration(300); animationGroup = new QSequentialAnimationGroup() ; animationGroup->addAnimation(anim1); animationGroup->addAnimation(anim2); animationGroup->addAnimation(anim3); connect(anim1, SIGNAL(valueChanged(QVariant)), this, SLOT(slotUpdateImage(QVariant))); connect(anim2, SIGNAL(valueChanged(QVariant)), this, SLOT(slotUpdateImage(QVariant))); connect(anim3, SIGNAL(valueChanged(QVariant)), this, SLOT(slotUpdateImage(QVariant))); //每隔10msec更新扫描线 m_timer = new QTimer(this); m_timer->setInterval(10); m_timer->start(); connect(m_timer, SIGNAL(timeout()), this, SLOT(slotChangeScan())); //每隔10msec更新扩散圈 m_ringsTimer = new QTimer(this); m_ringsTimer->setInterval(100); m_ringsTimer->start(); connect(m_ringsTimer, SIGNAL(timeout()), this, SLOT(slotChangeRing())); //每隔60ms更新监测点 m_checkPointTimer = new QTimer(this); m_checkPointTimer->setInterval(60); m_checkPointTimer->start(); connect(m_checkPointTimer,SIGNAL(timeout()), this, SLOT(slotRotatePoint())); } //=================================================================================== // 函数名称 | ~Frm_ScanTanTan2() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_ScanTanTan1::~Frm_ScanTanTan1() { if(m_vecCheckPos) { delete m_vecCheckPos; m_vecCheckPos = NULL; } } //=================================================================================== // 函数名称 | mousePressEvent() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |鼠标按下事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_ScanTanTan1::mousePressEvent(QMouseEvent *event) { if(!mb_isPressed) { QPoint pressedPoint = event->pos(); QPointF realPos = pressedPoint - rect().center(); QMatrix qMatrix; int width = this->width(); int height = this->height(); int side = qMin(width, height); qMatrix.scale(side / 200.0, side / 200.0); QRegion mEllipse = QRegion(-m_uinRingRadius, -m_uinRingRadius, m_uinRingRadius * 2, m_uinRingRadius * 2, QRegion::Ellipse); mEllipse = qMatrix.map(mEllipse); if( mEllipse.contains(realPos.toPoint())) { mb_isPressed = true; animationGroup->stop(); update(); } } } //=================================================================================== // 函数名称 | mouseReleaseEvent() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |鼠标松开事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_ScanTanTan1::mouseReleaseEvent(QMouseEvent *) { if(mb_isPressed) { mb_isPressed = false; RingData ring; ring.uin_radius = m_uinRingRadius; ring.uin_alpha = 255; ring.f_width = 3; m_listRings.push_back(ring); animationGroup->start(); update(); } } //=================================================================================== // 函数名称 | paintEvent() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |绘制函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_ScanTanTan1::paintEvent(QPaintEvent *) { int width = this->width(); int height = this->height(); int side = qMin(width, height); //绘制准备工作,启用反锯齿,平移坐标轴中心,等比例缩放 QPainter painter(this); painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);//圆滑处理斜线 painter.translate(width / 2, height / 2); painter.scale(side / 200.0, side / 200.0); //绘制扫描线 drawScan(&painter); //绘制扩散圈 drawRing(&painter); //绘制中间图片 drawImage(&painter); //绘制文本 drawValue(&painter); //绘制监测点 for (auto item = m_vecCheckPos->begin(); item != m_vecCheckPos->end(); ++item) { drawPoint(painter, *item); } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190六、摇杆方向盘
#include "Frm_Rocker.h" #include <QTimer> #include <QPainter> #include <QtMath> #include <QDebug> #include <QPropertyAnimation> #include <QSequentialAnimationGroup> //=================================================================================== // 函数名称 | Frm_ScanTanTan2() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |构造函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Rocker::Frm_Rocker(QWidget *parent) : QWidget(parent) { m_timer = new QTimer(this); m_intMouseX = 0; m_intMouseY = 0; connect(m_timer,&QTimer::timeout,this,[=]{emit sigKeyNumchanged(getKeyNum());}); connect(this,&Frm_Rocker::sigKeyNumchanged,this,[=](int num){ qDebug("当前位置=%d",num); }); } //=================================================================================== // 函数名称 | ~Frm_ScanTanTan2() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |析构函数 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== Frm_Rocker::~Frm_Rocker() { } //=================================================================================== // 函数名称 | mousePressEvent() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |鼠标按下事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Rocker::mousePressEvent(QMouseEvent *event) { m_intMouseX = event->pos().x() - width() / 2; m_intMouseY = event->pos().y() - height() / 2; qDebug("m_intMouseX=%d,m_intMouseY=%d",m_intMouseX,m_intMouseY); m_timer->start(100); mb_isPressed=true; update(); } //=================================================================================== // 函数名称 | mouseReleaseEvent() //----------------------------------------------------------------------------------- // 函数输入 | //----------------------------------------------------------------------------------- // 函数功能 |鼠标松开事件 //----------------------------------------------------------------------------------- // 返回值为 | //----------------------------------------------------------------------------------- // 函数作者 |xt //=================================================================================== void Frm_Rocker::mouseReleaseEvent(QMouseEvent *) { m_intMouseX = 0;//width()/2; m_intMouseY = 0;//height()/2; m_timer->stop(); mb_isPressed=false; emit sigKeyNumchanged(Rock_Stop); update(); }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788私信公众号 技术笔记闲谈,获取源码
相关知识
汽车仪表盘
Qt仪表盘绘制教程
仪表盘不显示油耗?别急,这几步让你轻松调出来!
[VC++]为自定义控件添加ToolTip
【QT教程】QT6 Web开发入门 QT Web
别被仪表骗了,教你汽车油耗正确计算方式,避免被坑
LabVIEW界面设计之控件美化
汽车仪表盘全解析,老司机必看!
仪表盘镜面花如何修复
数据可视化仪表盘
网址: Qt自定义精美的仪表盘控件(汽车仪表、指南针、雷达、摇杆) https://www.huajiangbk.com/newsview1946921.html
上一篇: 三维解读花呗ABS:行业地位、客 |
下一篇: 教你如何做人力资源仪表盘 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039