前置芝士:
- qt基本使用
- 绘图基本原理了解,画笔与画刷的基本用途
- 画笔
QPen绘制线条- 画刷
QBrush填充区域- 动手
效果预览:
拆解控件:
-
背景与边框
使用自定义画刷绘制指定大小,或控件窗口区域,边框使用
drawRoundedRect方法绘制圆角矩形,可指定区域亦可根据画布窗口的rect() - margin自动绘制指定距离的边框 -
指示器与背景
指示器为中间蓝色动态变化区域,背景为指示器底部背景框,即此部分为三个部分组成
- 根据数值动态变化高度和位置的矩形
- 固定位置与大小的矩形边框
- 固定位置与大小的矩形背景
-
刻度与刻度文字标签
刻度分为长分段刻度与短指示刻度,文字标签跟随长分段刻度同一时机绘制;分段警告标签,即图中绿色,黄色与红色区域,每段指定上限与下限百分比位置,以及对应颜色,可根据总有效刻度高度计算各分段的具体高度与坐标
-
竖排标题文字
渲染画布实现文字横向显示,或使用换行符不改变文字方向
具体实现
- 创建widget,继承
QWidget基类并重写void paintEvent(QPaintEvent *event)方法。 - 定义核心控件参数
- 量程范围,指定默认值,如
max_value,min_value,并给定默认值 - 当前值,如
value,并给定默认值 - 定义刻度分段,
segments=10,定义短刻度分段数,如short_segments=5
- 量程范围,指定默认值,如
- 绘制边框与背景
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();
}
// 其他省略