QT实现温度计控件

1,124 阅读2分钟

前置芝士:

  1. qt基本使用
  2. 绘图基本原理了解,画笔与画刷的基本用途
    • 画笔QPen绘制线条
    • 画刷QBrush填充区域
  3. 动手

效果预览:

拆解控件:

  1. 背景与边框

    使用自定义画刷绘制指定大小,或控件窗口区域,边框使用drawRoundedRect方法绘制圆角矩形,可指定区域亦可根据画布窗口的rect() - margin 自动绘制指定距离的边框

  2. 指示器与背景

    指示器为中间蓝色动态变化区域,背景为指示器底部背景框,即此部分为三个部分组成

    • 根据数值动态变化高度和位置的矩形
    • 固定位置与大小的矩形边框
    • 固定位置与大小的矩形背景
  3. 刻度与刻度文字标签

    刻度分为长分段刻度与短指示刻度,文字标签跟随长分段刻度同一时机绘制;分段警告标签,即图中绿色,黄色与红色区域,每段指定上限与下限百分比位置,以及对应颜色,可根据总有效刻度高度计算各分段的具体高度与坐标

  4. 竖排标题文字

    渲染画布实现文字横向显示,或使用换行符不改变文字方向

具体实现

  1. 创建widget,继承QWidget基类并重写void paintEvent(QPaintEvent *event)方法。
  2. 定义核心控件参数
    1. 量程范围,指定默认值,如max_value,min_value,并给定默认值
    2. 当前值,如value,并给定默认值
    3. 定义刻度分段,segments=10,定义短刻度分段数,如short_segments=5
  3. 绘制边框与背景
void drawFrame(QPainter *painter)
{
    painter->save();
    QPen pen(m_frameColor, 1); // 边框
    painter->setPen(pen);
    painter->setBrush(Qt::NoBrush);
    QRect frame_rect = rect() - m_margin - m_frame_margins;
    painter->drawRoundedRect(frame_rect, 10, 10);
    painter->restore();
}

void drawBg(QPainter *painter)
{
    painter->save();

    painter->setPen(Qt::NoPen);

    painter->setBrush(m_background);

    painter->drawRoundedRect(rect() - m_margin, 10, 10);

    painter->restore();
}

// 绘制指示器背景
void :drawIndicatorBg(QPainter *painter)
{
    painter->save();
    painter->setPen(Qt::NoPen);
    painter->setBrush(m_indicator_background);

    // 指示器宽高
    float width = 20;
    float height = 0.8 * rect().height();

    // 位置
    float x = (rect().width() - width) / 2;
    float y = rect().height() * 0.1;

    painter->drawRoundedRect(x, y, width, height, 10, 10);

    QPen pen;
    pen.setWidth(1);
    painter->setPen(pen);
    painter->setBrush(Qt::NoBrush);
    painter->drawRoundedRect(x, y, width, height, 10, 10);

    painter->restore();
}

// 其他省略