一、绘制基础

Qt 所有自定义绘图基于 QPainter 绘图器,规则:

  1. 自定义类继承 QWidget
  2. 重写纯虚函数 paintEvent(QPaintEvent *event)
  3. 在函数内使用 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 都可纯代码手绘。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐