Qt 进阶 05|自定义控件绘制,重写 QWidget 实现圆形控件、环形进度条、仪表盘
·
一、绘制基础
Qt 所有自定义绘图基于 QPainter 绘图器,规则:
- 自定义类继承
QWidget; - 重写纯虚函数
paintEvent(QPaintEvent *event); - 在函数内使用 QPainter 完成绘制。
二、示例 1:纯圆形控件
cpp
运行
// .h
protected:
void paintEvent(QPaintEvent *event) override;
// .cpp
void MyWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); // 开启抗锯齿
// 绘制圆形
painter.setBrush(QBrush(QColor(66,184,221)));
painter.setPen(Qt::NoPen);
painter.drawEllipse(rect()); // 基于控件外接矩形画圆
}
三、示例 2:环形进度条
cpp
运行
void MyWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
int progress = 60; // 进度 0~100
QRect rect = this->rect().adjusted(10,10,-10,-10);
// 背景圆环
painter.setPen(QPen(QColor("#cccccc"),8));
painter.drawArc(rect, 0, 360*16);
// 进度圆环
painter.setPen(QPen(QColor("#00b894"),8));
int angle = progress * 360 * 16 / 100;
painter.drawArc(rect, 90*16, -angle); // 从顶部开始逆时针绘制
}
四、示例 3:简易仪表盘(刻度 + 指针)
cpp
运行
void MyWidget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
QPoint center = rect().center();
// 外圈圆弧刻度
painter.setPen(QPen(Qt::darkGray,2));
painter.drawArc(rect().adjusted(20,20,-20,-20), 180*16, 180*16);
// 中心圆点
painter.setBrush(Qt::black);
painter.drawEllipse(center,5,5);
// 指针
painter.setPen(QPen(Qt::red,3));
painter.drawLine(center, QPoint(center.x()+40, center.y()+30));
}
五、关键要点
setRenderHint(QPainter::Antialiasing)必须开启,消除锯齿;drawArc角度单位:1 度 = 16 单位;- 动态刷新:调用
update()触发paintEvent重绘。
小结
paintEvent 是绘制入口,QPainter 提供点、线、圆、矩形、文字、图片全套绘制能力,复杂 UI 都可纯代码手绘。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)