qt5-入门-2D绘图-基础

参考:
QPainter_w3cschool
https://www.w3cschool.cn/learnroadqt/k7zd1j4l.html

C++ GUI Programming with Qt 4, Second Edition

本地环境:
win10专业版,64位,Qt 5.12

代码已经测试通过。其他例子日后更新。


基础知识

  • QPainter通过QPaintEngineQPainterDevice上进行绘制。如果希望使用OpenGL功能,应该使用QtOpenGL模块。
  • painter主要涉及三个设置:pen brush和font。font是用来写文字的,有字体和大小等属性。这些属性可以用QPenQBrushQFont对象调用setPen()setBrush()setFont()来设置。
  • 任何时候都可以使用save()将painter当前的状态保存到内部栈上,等需要恢复的时候使用restore()恢复。
  • QPainter是状态机,如果做了设置,只会影响设置之后的,直到下一次再设置才会改变,类似OpenGL。

pen

QPen是用来画线条和轮廓线的,包含的属性有颜色、线宽、line style、cap style、join style,后三个的含义见下图。
在这里插入图片描述

brush

brush指的是填充模式,包含的属性是颜色和样式。也可以是纹理(texture,a pixmap that is repeated infinitely)或者渐变(gradient)。
在这里插入图片描述
gradient
在这里插入图片描述

其他属性

  • brush下面的叫background,默认都是Qt::TransparentMode,如果改成Qt::OpaqueMode的话,可以设置background brush
  • brush的原点一般在左上角
  • clip 区域是可以绘图的区域,超过的部分不会显示

实例

简单例子

在这里插入图片描述

#ifndef PAINTEDWIDGET_H
#define PAINTEDWIDGET_H

#include <QWidget>
#include <QPainter>

class PaintedWidget : public QWidget
{
public:
    PaintedWidget() {
        resize(800, 600);
        setWindowTitle(tr("Paint Demo"));
    }

protected:
    void paintEvent(QPaintEvent *event) {
        QPainter painter(this);
        // QPainter::Antialiasing是一个渲染提示类型,表示启用抗锯齿功能,使得绘制的边缘更加平滑
        // 看起来更加自然和清晰。当将第二个参数设置为true时,即表示启用了抗锯齿功能。
        painter.setRenderHint(QPainter::Antialiasing, true);
        painter.setPen(QPen(Qt::black, 12, Qt::DashDotLine, Qt::RoundCap));
        painter.setBrush(QBrush(Qt::green, Qt::SolidPattern));
        // x, y, width, height
        painter.drawEllipse(80, 80, 400, 240);
    }
};

#endif // PAINTEDWIDGET_H


// main
PaintedWidget* p = new PaintedWidget;
p->show();

Bezier曲线

在这里插入图片描述

    void paintEvent(QPaintEvent *event) {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing, true);
        QPainterPath path;
        // 移动到起点
        path.moveTo(80, 320); 
        // 分别是第一个、第二个控制点和终点的坐标
        path.cubicTo(200, 80, 320, 80, 480, 320);
        painter.setPen(QPen(Qt::black, 8));
        painter.drawPath(path);
    }

点击事件

修改类,增加:

protected:
    void mousePressEvent(QMouseEvent *event) override;

signals:
    void clicked();

实现:

void PaintedWidget::mousePressEvent(QMouseEvent *event) {
    emit clicked();
}

在使用的时候需要绑定槽函数:

// p 是 PaintedWidget类的对象
connect(p, &PaintedWidget::clicked, this, &MainWindow::drawImages);

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 17:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 17:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 17:52:02       82 阅读
  4. Python语言-面向对象

    2024-04-29 17:52:02       91 阅读

热门阅读

  1. 力扣1146 快照数组

    2024-04-29 17:52:02       39 阅读
  2. LINUX 系统编程 局域网聊天室项目

    2024-04-29 17:52:02       28 阅读
  3. 抖音运营必备:作品发布必知的6大注意事项!

    2024-04-29 17:52:02       32 阅读
  4. Python中的map()和filter()函数:深入解析与使用场景

    2024-04-29 17:52:02       128 阅读
  5. python打印金字塔

    2024-04-29 17:52:02       134 阅读
  6. AI智能体的未来:引领科技创新潮流

    2024-04-29 17:52:02       27 阅读
  7. Support contact(DayMatter App)

    2024-04-29 17:52:02       37 阅读
  8. 同步与异步

    2024-04-29 17:52:02       36 阅读
  9. C#算法之希尔排序

    2024-04-29 17:52:02       39 阅读
  10. Kotlin->Kotlin协程作用域

    2024-04-29 17:52:02       29 阅读
  11. vite: 项目中使用Sass

    2024-04-29 17:52:02       28 阅读
  12. 通过iptables限制docker 容器的运行端口

    2024-04-29 17:52:02       36 阅读