Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

[复制链接]
发表于 2025-11-9 04:41:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页
目次
Qt画图根本
QPainter概述
根本工作流程
画图事故体系
paintEvent事故
重绘机制
笔墨绘制技能
根本笔墨绘制
​编辑
高级笔墨效果
根本图形绘制
线条绘制
​编辑
外形绘制
​编辑
图片处理处罚
根本图片绘制
高级图片效果
​编辑
殊效与动画
渐变效果
​编辑
时钟绘制


Qt画图根本

QPainter概述

QPainter是Qt中的核心画图类,提供了高度抽象的2D画图功能。它答应我们在各种装备上举行绘制,包罗:


  • 窗口部件(QWidget)
  • 像素图(QPixmap)
  • 图像(QImage)
根本工作流程

  1. void Widget::paintEvent(QPaintEvent* event)
  2. {
  3.     QPainter painter(this);  
  4.     // 设置绘图属性
  5.     painter.setRenderHint(QPainter::Antialiasing);
  6.     // 进行绘制操作
  7.     painter.drawLine(0, 0, 100, 100);
  8. }
复制代码
 
画图事故体系

paintEvent事故

paintEvent是Qt中处理处罚绘制的核心事故,在以下环境会被触发:


  • 窗口初次表现
  • 窗口从最小化规复
  • 窗口被其他窗口遮挡后重新表现
  • 调用update()或repaint()函数
重绘机制

  1. class Widget : public QWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     Widget(QWidget *parent = nullptr);
  6.     ~Widget();
  7.     void paintEvent(QPaintEvent* event) override
  8.     {
  9.         QPainter painter(this);
  10.         // 绘制代码
  11.     }
  12.     void updateContent()
  13.     {
  14.         update();  // 请求重绘,异步
  15.         // repaint();  // 立即重绘,同步
  16.     }
  17. private:
  18.     Ui::Widget *ui;
  19. };
复制代码
笔墨绘制技能

根本笔墨绘制

  1. class Widget : public QWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     Widget(QWidget *parent = nullptr);
  6.     ~Widget();
  7.     void paintEvent(QPaintEvent*) override
  8.     {
  9.         QPainter painter(this);
  10.         // 设置字体
  11.         QFont font("Arial", 20);
  12.         font.setBold(true);
  13.         painter.setFont(font);
  14.         // 设置颜色
  15.         painter.setPen(QColor(255, 0, 0));
  16.         // 绘制文本
  17.         painter.drawText(rect(), Qt::AlignCenter, "Hello Qt!");
  18.     }
  19. private:
  20.     Ui::Widget *ui;
  21. };
复制代码


高级笔墨效果

  1.     void paintEvent(QPaintEvent*) override
  2.     {
  3.         QPainter painter(this);
  4.         // 文字阴影效果
  5.         QFont font("Times", 40);
  6.         painter.setFont(font);
  7.         // 绘制阴影
  8.         painter.setPen(QColor(0, 0, 0, 127));
  9.         painter.drawText(rect().adjusted(2, 2, 2, 2),
  10.                          Qt::AlignCenter, "Shadow Text");
  11.         // 绘制主文本
  12.         painter.setPen(Qt::white);
  13.         painter.drawText(rect(), Qt::AlignCenter, "Shadow Text");
  14.     }
复制代码

根本图形绘制

线条绘制

  1. void paintEvent(QPaintEvent*) override  
  2. {  
  3.     QPainter painter(this);  
  4.    
  5.     // 设置画笔  
  6.     QPen pen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);  
  7.     painter.setPen(pen);  
  8.    
  9.     // 绘制各种线条  
  10.     painter.drawLine(10, 10, 100, 100);  // 直线  
  11.     painter.drawArc(10, 120, 80, 80, 0, 180 * 16);  // 圆弧  
  12. }
复制代码


外形绘制

  1.    void paintEvent(QPaintEvent*) override  
  2.     {  
  3.         QPainter painter(this);  
  4.         
  5.         // 矩形  
  6.         painter.fillRect(10, 10, 90, 60, Qt::blue);  
  7.         
  8.         // 圆形  
  9.         painter.drawEllipse(120, 10, 90, 90);  
  10.         
  11.         // 多边形  
  12.         QPolygon polygon;  
  13.         polygon << QPoint(10,100) << QPoint(110,100)   
  14.                 << QPoint(60,180);  
  15.         painter.drawPolygon(polygon);  
  16.     }
复制代码


图片处理处罚

根本图片绘制

  1. void paintEvent(QPaintEvent*) override  
  2. {  
  3.     QPainter painter(this);  
  4.    
  5.     QPixmap pixmap(":/images/example.png");  
  6.     painter.drawPixmap(10, 10, pixmap);  
  7. }
复制代码
高级图片效果

  1.     void paintEvent(QPaintEvent*) override
  2.     {
  3.         QPainter painter(this);
  4.         QPixmap pixmap("C:\\Users\\Administrator\\Desktop\\图形界面-QT.png");
  5.         // 图片缩放
  6.         QPixmap scaled = pixmap.scaled(200, 200,
  7.                                        Qt::KeepAspectRatio,
  8.                                        Qt::SmoothTransformation);
  9.         // 添加圆形裁剪
  10.         QPainterPath path;
  11.         path.addEllipse(10, 10, 200, 200);
  12.         painter.setClipPath(path);
  13.         painter.drawPixmap(10, 10, scaled);
  14.     }
复制代码


殊效与动画

渐变效果

  1. void paintEvent(QPaintEvent*) override  
  2. {  
  3.     QPainter painter(this);  
  4.    
  5.     // 线性渐变  
  6.     QLinearGradient gradient(0, 0, width(), height());  
  7.     gradient.setColorAt(0, Qt::red);  
  8.     gradient.setColorAt(1, Qt::blue);  
  9.    
  10.     painter.fillRect(rect(), gradient);  
  11. }
复制代码


时钟绘制


  1. class ClockWidget : public QWidget
  2. {
  3.     Q_OBJECT
  4. public:
  5.     explicit ClockWidget(QWidget *parent = nullptr) : QWidget(parent)
  6.     {
  7.         setFixedSize(400, 400);
  8.         QTimer *timer = new QTimer(this);
  9.         connect(timer, &QTimer::timeout, this, QOverload<>::of(&ClockWidget::update));
  10.         timer->start(1000);
  11.     }
  12. protected:
  13.     void paintEvent(QPaintEvent *event) override
  14.     {
  15.         Q_UNUSED(event);
  16.         QPainter painter(this);
  17.         painter.setRenderHint(QPainter::Antialiasing);
  18.         painter.translate(width() / 2, height() / 2);
  19.         QTime currentTime = QTime::currentTime();
  20.         drawClockPlate(&painter);
  21.         drawHourHand(&painter, currentTime);
  22.         drawMinuteHand(&painter, currentTime);
  23.         drawSecondHand(&painter, currentTime);
  24.         drawCenterPoint(&painter);
  25.     }
  26. private:
  27.     void drawClockPlate(QPainter *painter)
  28.     {
  29.         QPen pen(Qt::black);
  30.         pen.setWidth(2);
  31.         painter->setPen(pen);
  32.         painter->setBrush(Qt::white);
  33.         painter->drawEllipse(-180, -180, 360, 360);
  34.         for (int i = 0; i < 60; ++i) {
  35.             painter->save();
  36.             painter->rotate(6.0 * i);
  37.             if (i % 5 == 0) {
  38.                 pen.setWidth(3);
  39.                 painter->setPen(pen);
  40.                 painter->drawLine(0, -160, 0, -145);
  41.                 painter->save();
  42.                 painter->rotate(-6.0 * i);
  43.                 QFont font("Arial", 15, QFont::Bold);
  44.                 painter->setFont(font);
  45.                 int num = (i / 5 == 0) ? 12 : i / 5;
  46.                 QRect textRect(-20, -190, 40, 40);
  47.                 painter->drawText(textRect, Qt::AlignCenter, QString::number(num));
  48.                 painter->restore();
  49.             } else {
  50.                 pen.setWidth(1);
  51.                 painter->setPen(pen);
  52.                 painter->drawLine(0, -160, 0, -150);
  53.             }
  54.             painter->restore();
  55.         }
  56.     }
  57.     void drawHourHand(QPainter *painter, const QTime &time)
  58.     {
  59.         painter->save();
  60.         double angle = 30.0 * (time.hour() % 12) + 0.5 * time.minute();
  61.         painter->rotate(angle);
  62.         QPen pen(Qt::black, 4);
  63.         painter->setPen(pen);
  64.         painter->drawLine(0, 0, 0, -80);
  65.         painter->restore();
  66.     }
  67.     void drawMinuteHand(QPainter *painter, const QTime &time)
  68.     {
  69.         painter->save();
  70.         double angle = 6.0 * time.minute() + 0.1 * time.second();
  71.         painter->rotate(angle);
  72.         QPen pen(Qt::blue, 3);
  73.         painter->setPen(pen);
  74.         painter->drawLine(0, 0, 0, -120);
  75.         painter->restore();
  76.     }
  77.     void drawSecondHand(QPainter *painter, const QTime &time)
  78.     {
  79.         painter->save();
  80.         double angle = 6.0 * time.second();
  81.         painter->rotate(angle);
  82.         QPen pen(Qt::red, 2);
  83.         painter->setPen(pen);
  84.         painter->drawLine(0, 20, 0, -140);
  85.         painter->restore();
  86.     }
  87.     void drawCenterPoint(QPainter *painter)
  88.     {
  89.         painter->setPen(Qt::NoPen);
  90.         painter->setBrush(Qt::red);
  91.         painter->drawEllipse(-8, -8, 16, 16);
  92.         painter->setBrush(Qt::black);
  93.         painter->drawEllipse(-4, -4, 8, 8);
  94.     }
  95. };
复制代码

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表