QT 2D绘图

缺乏、安全感 2022-03-26 07:41 417阅读 0赞

文章目录

  • 基础知识
  • 基本绘制和填充
  • 绘制文字
    • 代码
    • 效果
  • 绘制路径
    • 代码
    • 效果
  • 绘制图像
    • 四种常见的绘制图像的方法
    • 代码
    • 效果
    • 双缓冲绘图
      • 效果显示

基础知识

  • 主要的三个类

    • QPainter

      • QWidget
      • QPixmap
      • QPicture
      • QPrinter
      • QOpenGLPaintDevice
    • QPainterDevice
    • QPainterEngine

三者关系图

QPainter

QPainEngine

QPaintDevice

基本绘制和填充

绘图系统由QPainter完成具体的绘制操作,QPainter可以绘制一切想要的图形,QPainter可以在继承自QPainterDevice类的任何对象上进行绘制操作

Qt 之图形(QPainter 的基本绘图) 看这里

绘制文字

可参考Qt 之图形(绘制文本)

代码

  1. QPainter painter(this);
  2. QRectF rect(10.0, 10.0, 380.0, 280.0);
  3. painter.setPen(Qt::red);
  4. painter.drawRect(rect);
  5. painter.setPen(Qt::blue);
  6. painter.setPen(Qt::blue);
  7. painter.drawText(rect, Qt::AlignHCenter, QStringLiteral("你好"));
  8. painter.drawText(rect, Qt::AlignLeft, QStringLiteral("左对齐"));
  9. painter.drawText(rect, Qt::AlignRight, QStringLiteral("右对齐"));
  10. painter.drawText(rect, Qt::AlignVCenter, QStringLiteral("中间左侧对齐"));
  11. painter.drawText(rect, Qt::AlignBottom, QStringLiteral("底部对齐"));
  12. painter.drawText(rect, Qt::AlignCenter, QStringLiteral("中间对齐"));
  13. painter.drawText(rect, Qt::AlignBottom | Qt::AlignRight, QStringLiteral("底部 | 右侧对齐"));

效果

在这里插入图片描述

绘制路径

详细看这里Qt 之图形(QPainterPath)

代码

  1. QPainter painter(this);
  2. painter.setRenderHint(QPainter::Antialiasing);
  3. painter.setPen(Qt::red);
  4. QPainterPath path;
  5. path.moveTo(50, 250);
  6. path.lineTo(50, 230);
  7. path.cubicTo(QPointF(105, 40), QPointF(115, 80), QPointF(120, 60));
  8. path.lineTo(130, 130);
  9. path.addEllipse(QPoint(130, 130), 30, 30);
  10. painter.setBrush(Qt::red);
  11. painter.drawPath(path);
  12. path.translate(200, 0);
  13. painter.setPen(Qt::darkBlue);
  14. painter.drawPath(path);

效果

在这里插入图片描述

绘制图像

四种常见的绘制图像的方法

在这里插入图片描述

代码

  1. QPainter painter;
  2. //绘制image
  3. QImage image(100, 100, QImage::Format_ARGB32);
  4. painter.begin(&image);
  5. painter.setPen(QPen(Qt::green, 3));
  6. painter.setBrush(Qt::yellow);
  7. painter.drawRect(10, 10, 60, 60);
  8. painter.drawText(10, 10, 60, 60, Qt::AlignCenter, QStringLiteral("QImage"));
  9. painter.setBrush(QColor(0, 0, 0, 100));
  10. painter.drawRect(50, 50, 40, 40);
  11. painter.end();
  12. //绘制pixmap
  13. QPixmap pix(100, 100);
  14. painter.begin(&pix);
  15. painter.setPen(QPen(Qt::green, 3));
  16. painter.setBrush(Qt::yellow);
  17. painter.drawRect(10, 10, 60, 60);
  18. painter.drawText(10, 10, 60, 60, Qt::AlignCenter, QStringLiteral("QPixmap"));
  19. painter.setBrush(QColor(0, 0, 0, 100));
  20. painter.drawRect(50, 50, 40, 40);
  21. painter.end();
  22. //绘制bitmap
  23. QBitmap bit(100, 100);
  24. painter.begin(&bit);
  25. painter.setPen(QPen(Qt::green, 3));
  26. painter.setBrush(Qt::yellow);
  27. painter.drawRect(10, 10, 60, 60);
  28. painter.drawText(10, 10, 60, 60, Qt::AlignCenter, QStringLiteral("QBitmap"));
  29. painter.setBrush(QColor(0, 0, 0, 100));
  30. painter.drawRect(50, 50, 40, 40);
  31. painter.end();
  32. //绘制picture
  33. QPicture picture;
  34. painter.begin(&picture);
  35. painter.setPen(QPen(Qt::green, 3));
  36. painter.setBrush(Qt::yellow);
  37. painter.drawRect(10, 10, 60, 60);
  38. painter.drawText(10, 10, 60, 60, Qt::AlignCenter, QStringLiteral("QPicture"));
  39. painter.setBrush(QColor(0, 0, 0, 100));
  40. painter.drawRect(50, 50, 40, 40);
  41. painter.end();
  42. painter.begin(this);
  43. painter.drawImage(50, 20, image);
  44. painter.drawPixmap(200, 20, pix);
  45. painter.drawPixmap(50, 170, bit);
  46. painter.drawPicture(200, 170, picture);

效果

在这里插入图片描述
在这里插入图片描述

双缓冲绘图

在这里插入图片描述### 代码
在头文件加入

  1. private:
  2. QPixmap pix;
  3. QPixmap tempPix;
  4. QPoint startPoint;
  5. QPoint endPoint;
  6. //是否正在绘图的标志
  7. bool isDrawing;
  8. protected:
  9. void mousePressEvent(QMouseEvent *event);
  10. void mouseMoveEvent(QMouseEvent *event);
  11. void mouseReleaseEvent(QMouseEvent *event);
  12. void paintEvent(QPaintEvent *event);

在cpp文件加入

  1. void ch10_4_1::mousePressEvent(QMouseEvent *event)
  2. {
  3. if (event->button() == Qt::LeftButton)
  4. {
  5. startPoint = event->pos();
  6. isDrawing = true;
  7. }
  8. }
  9. void ch10_4_1::mouseMoveEvent(QMouseEvent *event)
  10. {
  11. if (event->button() & Qt::LeftButton){
  12. endPoint = event->pos();
  13. tempPix = pix;
  14. update();
  15. }
  16. }
  17. void ch10_4_1::mouseReleaseEvent(QMouseEvent *event)
  18. {
  19. if (event->button() == Qt::LeftButton){
  20. endPoint = event->pos();
  21. isDrawing = false;
  22. update();
  23. }
  24. }
  25. void ch10_4_1::paintEvent(QPaintEvent *event)
  26. {
  27. int x = startPoint.x();
  28. int y = startPoint.y();
  29. int width = endPoint.x() - x;
  30. int height = endPoint.y() - y;
  31. QPainter painter;
  32. painter.begin(&tempPix);
  33. painter.drawRect(x, y, width, height);
  34. painter.end();
  35. painter.begin(this);
  36. painter.drawPixmap(0, 0, tempPix);
  37. if (! isDrawing)
  38. {
  39. pix = tempPix;
  40. }
  41. }

其中的ch10_4_1为类名

这里先在临时缓冲区进行绘图,然后将其绘制到界面上,最后判断是否已经完成绘图,如果是,则将临时缓冲区内容复制到缓冲区中,这样就完成了整个矩形的绘制

如果想实现Windows桌面上的拖动鼠标出现的橡皮筋选择框,可以使用QRubberBand类来实现橡皮筋线。

效果显示

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,417人围观)

还没有评论,来说两句吧...

相关阅读