当前位置: 首页 > news >正文

川制作官方网站百度官方网址

川制作官方网站,百度官方网址,网页布局设计技术,东营小程序开发制作文章目录 1 效果2 原理3 编码实践3.1 创建仪表属性类3.2 设置类属性3.3 绘制图案3.3.1 设置反走样3.3.2 绘制背景3.3.3 重新定义坐标原点3.3.4 绘制圆环3.3.5 绘制刻度线3.3.6 绘制刻度线上的描述值3.3.7 绘制指针3.3.8 绘制指针数值和单位3.3.9 控制指针变化 扩展福利参考 1 效…

文章目录

  • 1 效果
  • 2 原理
  • 3 编码实践
    • 3.1 创建仪表属性类
    • 3.2 设置类属性
    • 3.3 绘制图案
      • 3.3.1 设置反走样
      • 3.3.2 绘制背景
      • 3.3.3 重新定义坐标原点
      • 3.3.4 绘制圆环
      • 3.3.5 绘制刻度线
      • 3.3.6 绘制刻度线上的描述值
      • 3.3.7 绘制指针
      • 3.3.8 绘制指针数值和单位
      • 3.3.9 控制指针变化
  • 扩展
  • 福利
  • 参考

1 效果

下面仪表模拟的是转速表和速度表,转速表中有怠速转速,降功转速的逻辑。
在这里插入图片描述
下面是模拟双针仪表的效果:

在这里插入图片描述

2 原理

1,重写paintEvent进行仪表绘制,使用QPropertyAnimation进行动画绘制;

2,进行属性动画绘制时,需要使用Q_PROPERTY宏用于声明类的属性;

3 编码实践

下面代码位调用方法,接口的具体实现在后文中有详细描述。

发射的信号:

    //发送发动机转速void sendEngineSpeed(double);//发送大机速度值void sendTrainSpeedNum(short);

创建仪表类并设置参数:

//发动机转速表DashBoardWidget3 *dashBoardWidget5 = new DashBoardWidget3(this);dashBoardWidget5->setScaleMajor(6);//6个大区间dashBoardWidget5->setScaleMinor(5);//每个区间5个小格dashBoardWidget5->setUnit("");dashBoardWidget5->setText("RPMx100");dashBoardWidget5->setmax(30);dashBoardWidget5->setUnitDrawInterval(1);//每隔一个大区间画一个刻度线描述值dashBoardWidget5->setGeometry(750, 20, 300, 300);connect(this, &MainInterface::sendEngineSpeed,dashBoardWidget5, &DashBoardWidget3::valueChanged);//汽车速度表DashBoardWidget3 *dashBoardWidget6 = new DashBoardWidget3(this);dashBoardWidget6->setScaleMajor(12);//大区间dashBoardWidget6->setScaleMinor(2);//每个区间的小值dashBoardWidget6->setUnit("");dashBoardWidget6->setText("km/h");dashBoardWidget6->setmax(120);dashBoardWidget6->setUnitDrawInterval(2);// dashBoardWidget->move(600, 20);dashBoardWidget6->setGeometry(750, 300, 300, 300);connect(this, &MainInterface::sendTrainSpeedNum,dashBoardWidget6, &DashBoardWidget3::valueChanged);

3.1 创建仪表属性类

struct DashBoardWidgetPrivate{//刻度值的最大值和最小值int maxValue = 100;int minValue = 0;//刻度值角度double startAngle = -50;double endAngle = 230;double value = minValue;//大区间,最小区间int scaleMajor = 10;int scaleMinor = 5;//单位和描述文字QString unit = "";QString text = "";//仪表颜色QColor arcColor = QColor(56, 61, 74);//QColor(0, 128, 255);//刻度颜色QColor scaleColor = QColor(71, 186, 252);//QColor(4, 168, 173);//指针颜色QColor pointerColor = QColor(255, 0, 0);//文件颜色QColor textColor = QColor(144, 133, 116);//背景颜色QColor backgroundColor = Qt::transparent;//仪表指针1:属性动画QPropertyAnimation *animation;};

3.2 设置类属性

    Q_PROPERTY(double value READ value WRITE setValue)Q_PROPERTY(double min READ min WRITE setMin)Q_PROPERTY(double max READ max WRITE setmax)Q_PROPERTY(double startAngle READ startAngle WRITE setStartAngle)Q_PROPERTY(double endAngle READ endAngle WRITE setEndAngle)Q_PROPERTY(int scaleMajor READ scaleMajor WRITE setScaleMajor)Q_PROPERTY(int scaleMinor READ scaleMinor WRITE setScaleMinor)Q_PROPERTY(QString unit READ unit WRITE setUnit)Q_PROPERTY(QString text READ text WRITE setText)Q_PROPERTY(QColor arcColor READ arcColor WRITE setArcColor)Q_PROPERTY(QColor scaleColor READ scaleColor WRITE setScaleColor)Q_PROPERTY(QColor pointerColor READ pointerColor WRITE setPointerColor)Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor)Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor)

创建对应的函数:

    QSize sizeHint() const override;QSize minimumSizeHint() const override;double value() const;void setValue(const double value);void setMin(const double min);double min() const;void setmax(const double max);double max() const;void setStartAngle(const double startAngle);double startAngle() const;void setEndAngle(const double endAngle);double endAngle() const;void setScaleMajor(const int scale);int scaleMajor() const;void setScaleMinor(const int scale);int scaleMinor() const;void setUnit(const QString &unit);//设置单位QString unit() const;void setText(const QString &text);//设置文字QString text() const;void setArcColor(const QColor &color);QColor arcColor() const;void setScaleColor(const QColor &color);QColor scaleColor() const;void setPointerColor(const QColor &color);QColor pointerColor() const;void setTextColor(const QColor &color);QColor textColor() const;void setBackgroundColor(const QColor &color);QColor backgroundColor() const;

3.3 绘制图案

在类绘制事件中,添加各种绘制信息:

void DashBoardWidget3::paintEvent(QPaintEvent *event){QWidget::paintEvent(event);QPainter painter(this);//....
}

3.3.1 设置反走样

//反走样是图形学中的重要概念,用以防止通常所说的“锯齿”现象的出现。很多系统的绘图 API 里面都内置了有关反走样的算法,不过由于性能问题,默认一般是关闭的painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

3.3.2 绘制背景

    // 背景if (d->backgroundColor != Qt::transparent) {painter.setPen(Qt::NoPen);painter.fillRect(rect(), d->backgroundColor);}

3.3.3 重新定义坐标原点

    // 平移中心painter.translate(width() / 2, height() / 2);

调整之前:
在这里插入图片描述

调整之后:

在这里插入图片描述

3.3.4 绘制圆环

    // 圆环drawArc(&painter);

实现函数:

void DashBoardWidget3::drawArc(QPainter *painter)
{double min = qMin(width(), height());double arcWidth = min / 15.0;double radius = min / 3 - arcWidth;QRectF rect = QRectF(-radius, -radius, radius * 2, radius * 2);QPen pen;pen.setWidthF(arcWidth);pen.setCapStyle(Qt::FlatCap);// 圆弧背景double angle = d->endAngle - d->startAngle;pen.setColor(d->arcColor);painter->setPen(pen);painter->drawArc(rect, d->startAngle * 16, angle * 16);
}

绘制效果如下:

在这里插入图片描述

3.3.5 绘制刻度线

    // 刻度线drawScale(&painter);

实现函数:

void DashBoardWidget3::drawScale(QPainter *painter)
{painter->save();painter->rotate(270 - d->endAngle);int steps = (d->scaleMajor * d->scaleMinor);//区间*每个区间的小刻度double angleStep = (d->endAngle - d->startAngle) / steps;double min = qMin(width(), height());double radius = min / 3;QPen pen(d->scaleColor);pen.setCapStyle(Qt::RoundCap);for (int i = 0; i <= steps; i++) {if (i % d->scaleMinor == 0) {//画大刻度pen.setWidthF(1.5);painter->setPen(pen);painter->drawLine(0, radius - 8, 0, radius + 5);//画刻度线长度}else{//画小刻度pen.setWidthF(0.5);painter->setPen(pen);painter->drawLine(0, radius - 8, 0, radius - 3);}painter->rotate(angleStep);}painter->restore();
}

效果如下:

在这里插入图片描述

3.3.6 绘制刻度线上的描述值

    // 刻度线上的描述值drawScaleNum(&painter);

实现函数:

//画刻度线上的说明值
void DashBoardWidget3::drawScaleNum(QPainter *painter)
{painter->save();painter->setPen(d->scaleColor);double min = qMin(width(), height());double radius = min / 2.4;//半径QFont font("Microsoft YaHei", min / 25);painter->setFont(font);double startRad = d->endAngle * (M_PI / 180);//qDebug()<<"startRad:"<<startRad;double deltaRad = (d->endAngle - d->startAngle) * (M_PI / 180) / d->scaleMajor;QFontMetrics fontMetrics(font);if(m_unitDrawInterval > d->scaleMajor){m_unitDrawInterval = d->scaleMajor;}for (int i = 0; i <= d->scaleMajor; i += m_unitDrawInterval) {//每个大区间都要画刻度值double sina = qSin(startRad - i * deltaRad);double cosa = qCos(startRad - i * deltaRad);double value = 1.0 * i * ((d->maxValue - d->minValue) / d->scaleMajor) + d->minValue;// 1.0 * 1 *((1200 -0)/10) + 0// qDebug()<<"d->maxValue:"<<d->maxValue;//qDebug()<<"d->minValue:"<<d->minValue;//qDebug()<<"value:"<<value;QString strValue = QString("%1").arg(value);double textWidth = fontMetrics.horizontalAdvance(strValue);double textHeight = fontMetrics.height();int x = radius * cosa - textWidth / 2;int y = -radius * sina + textHeight / 4;painter->drawText(x, y, strValue);}painter->restore();
}

效果如下:

在这里插入图片描述

3.3.7 绘制指针

    // 指示器(指针)drawPointer(&painter);

实现函数:

//画指针
void DashBoardWidget3::drawPointer(QPainter *painter)
{painter->save();painter->setPen(Qt::NoPen);painter->setBrush(d->pointerColor);//设置画笔颜色double radius = qMin(width(), height()) / 3.0;QPolygonF pts;pts << QPointF(-5, 0) << QPointF(0, -8)<< QPointF(5, 0) << QPointF(0, radius);painter->rotate(270 - d->endAngle);double degRotate = (d->endAngle - d->startAngle) / (d->maxValue - d->minValue) * (d->value - d->minValue);painter->rotate(degRotate);painter->drawConvexPolygon(pts);painter->restore();
}

效果如下:

在这里插入图片描述

3.3.8 绘制指针数值和单位

    // 显示指针数值和单位drawValue(&painter);

实现函数:

//画数值和单位
void DashBoardWidget3::drawValue(QPainter *painter)
{painter->save();painter->setPen(d->textColor);double min = qMin(width(), height());double radius = min / 2.0 - min / 4.8;QFont font("Microsoft YaHei", min / 25);painter->setFont(font);//绘制指针数值和单位QString strValue = QString("%1 %2").arg(d->value).arg(d->unit);QRectF valueRect(-radius, radius / 2.5, radius * 2, radius / 3.5);QColor pointerColor = QColor(0, 0, 0);painter->setBrush(pointerColor);//设置颜色painter->setPen(QPen(QColor(0, 0, 0)));painter->drawText(valueRect, Qt::AlignCenter, strValue);//绘制描述文字QRectF text2Rect(-radius, radius / 1.5, radius * 2, radius / 2.5);painter->setPen(QPen(QColor(255, 0, 0)));//设置画笔颜色painter->setBrush(d->textColor);//设置画笔颜色font.setPixelSize(12);painter->setFont(font);painter->drawText(text2Rect, Qt::AlignCenter, d->text);painter->restore();
}

实现效果:

在这里插入图片描述

3.3.9 控制指针变化

signals:void valueChanged(const double value);DashBoardWidget3::DashBoardWidget3(QWidget *parent): QWidget(parent), d(new DashBoardWidgetPrivate)
{d->animation = new QPropertyAnimation(this, "value", this);setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);connect(this, &DashBoardWidget3::valueChanged,this, &DashBoardWidget3::onStartAnimation);}

实现函数:

//仪表指针变动的动画
void DashBoardWidget3::onStartAnimation(double value)
{if(value < d->minValue|| value > d->maxValue|| value == d->value){}else{double start = d->value;double end = value;d->animation->setStartValue(start);d->animation->setEndValue(end);d->animation->start();}
}

扩展

可以思考以下,下面的效果如何实现?

在这里插入图片描述

福利

完整的项目代码

欢迎各位start

参考

Qt自定义控件之仪表盘的完整实现


文章转载自:
http://dinncodilatation.stkw.cn
http://dinncounadvisedly.stkw.cn
http://dinncostaggerbush.stkw.cn
http://dinncofragrancy.stkw.cn
http://dinncosteely.stkw.cn
http://dinncoostectomy.stkw.cn
http://dinncoimam.stkw.cn
http://dinncosublessor.stkw.cn
http://dinncotowerless.stkw.cn
http://dinncoacrita.stkw.cn
http://dinncoindurate.stkw.cn
http://dinncorussety.stkw.cn
http://dinncotadzhiki.stkw.cn
http://dinncoreticulated.stkw.cn
http://dinncosulfamethoxypyridazine.stkw.cn
http://dinncobritzka.stkw.cn
http://dinncohereinbelow.stkw.cn
http://dinncoremarkable.stkw.cn
http://dinncoperonism.stkw.cn
http://dinncostallion.stkw.cn
http://dinncoenergise.stkw.cn
http://dinncoxenobiotic.stkw.cn
http://dinncomafic.stkw.cn
http://dinncocaulicolous.stkw.cn
http://dinncosupremely.stkw.cn
http://dinncosourdine.stkw.cn
http://dinncodexamphetamine.stkw.cn
http://dinncoallah.stkw.cn
http://dinncoinsomnia.stkw.cn
http://dinncolumbosacral.stkw.cn
http://dinncopicker.stkw.cn
http://dinncogravicembalo.stkw.cn
http://dinncofanega.stkw.cn
http://dinncogravelstone.stkw.cn
http://dinncosteeplejack.stkw.cn
http://dinncosickee.stkw.cn
http://dinncogarrigue.stkw.cn
http://dinncofermentum.stkw.cn
http://dinncosulfuric.stkw.cn
http://dinncoshellfishery.stkw.cn
http://dinncononbusiness.stkw.cn
http://dinncosqueak.stkw.cn
http://dinncofisherboat.stkw.cn
http://dinncosluggard.stkw.cn
http://dinncooverspeculate.stkw.cn
http://dinncomodifier.stkw.cn
http://dinncothermophysics.stkw.cn
http://dinncocounterdevice.stkw.cn
http://dinncopliability.stkw.cn
http://dinncothermosensitive.stkw.cn
http://dinncospinout.stkw.cn
http://dinncoliberty.stkw.cn
http://dinncofil.stkw.cn
http://dinncomessianism.stkw.cn
http://dinncoasseveration.stkw.cn
http://dinncomastika.stkw.cn
http://dinncosenescence.stkw.cn
http://dinncolanguor.stkw.cn
http://dinncoshutt.stkw.cn
http://dinncogallygaskins.stkw.cn
http://dinncorewin.stkw.cn
http://dinncocessation.stkw.cn
http://dinncodubbin.stkw.cn
http://dinnconoblewoman.stkw.cn
http://dinncounsummoned.stkw.cn
http://dinncoquadriga.stkw.cn
http://dinncopinteresque.stkw.cn
http://dinncosopite.stkw.cn
http://dinncotetanic.stkw.cn
http://dinncoheathberry.stkw.cn
http://dinncoperfumery.stkw.cn
http://dinncovexed.stkw.cn
http://dinncoshikker.stkw.cn
http://dinncodunt.stkw.cn
http://dinncodifficult.stkw.cn
http://dinncospur.stkw.cn
http://dinncourban.stkw.cn
http://dinncocultch.stkw.cn
http://dinncodaredevilry.stkw.cn
http://dinncorow.stkw.cn
http://dinncoremarkably.stkw.cn
http://dinncochasten.stkw.cn
http://dinncotungusic.stkw.cn
http://dinncodecisive.stkw.cn
http://dinncoanimalcule.stkw.cn
http://dinncohackberry.stkw.cn
http://dinncodogate.stkw.cn
http://dinncointermit.stkw.cn
http://dinncohebe.stkw.cn
http://dinncopriming.stkw.cn
http://dinncojudiciary.stkw.cn
http://dinncogoogol.stkw.cn
http://dinncosteepness.stkw.cn
http://dinncononpathogenic.stkw.cn
http://dinncooverpunch.stkw.cn
http://dinncoaftertime.stkw.cn
http://dinncoantispasmodic.stkw.cn
http://dinncodisenchanting.stkw.cn
http://dinncomorphemics.stkw.cn
http://dinncobarcarolle.stkw.cn
http://www.dinnco.com/news/125092.html

相关文章:

  • 天津网站建设-中国互联下店拓客团队
  • 外贸网站建设推广公司百度关键词搜索排名
  • 小学网站建设报告网站搭建公司哪家好
  • 怎么看网站发的外链国内搜索引擎有哪些
  • 做qq主题的网站百度官方优化指南
  • 站长工具高清吗好用的搜索引擎
  • 网站建设后台管理便捷新闻头条今日新闻60条
  • 网站点击排名网站优化外包费用
  • 电子商务网站建设多少钱seo搜狗
  • 做一个企业网站需要多少钱网络营销课程介绍
  • 织梦 蓝色 个人网站博客网站源码手机百度2020
  • 网站做跳转附近广告公司
  • 安徽建设干部学校网站首页简述网络营销的方法
  • 烟台汽车网站建设seo如何提升排名收录
  • 男女做的的真实视频网站渠道营销推广方案
  • 购物网站网页设计图片关键词网站排名查询
  • 做商城网站哪里好专业网站优化推广
  • 国内经典网站西安网站制作价格
  • wordpress可以做网站吗买转发链接
  • 响应式网站怎么做才实用网络营销推广手段
  • 自己做网站 为什么出现403营销策划方案ppt范文
  • 扬州市建筑信息平台谷歌seo需要做什么的
  • 上海网站建设 浦东跨境电商靠谱吗
  • 那个网站专做委外发手工杭州seo泽成
  • 自学移动端网站开发媒体平台
  • 邢台做网站优化哪儿好网站推广策划方案
  • wordpress wshk安卓aso关键词优化
  • 南通网站建设公司网站百度权重查询
  • 河北公司网站开发网站建站系统
  • 网站建设调研最新军事动态