【QT】绘图API

目录

绘图API核心类

第一步:重写paintEvent事件函数

第二步:创建QPainter

第三步:设置QPainter绘制的文字类型(非必须)

第四步:设置画笔属性(线条)

第五步:设置画刷的属性(填充)

第六步:开始绘制

绘制线段

绘制矩形

绘制圆形

绘制文本

绘制图片

基础绘制

缩放绘制

图片旋转

图片平移


前面介绍的Qt的各种控件,本质上都是画出来的,都是Qt已经提前画好的,拿过来就能使用,实际开发中,很可能出现现有的控件无法满足需求,需要自己diy一些控件/效果,Qt提供的绘图API就是为了解决上述问题的。

绘图API核心类

说明
QPainter "绘画者" 或者 "画家". 用来绘图的对象, 提供了⼀系列 drawXXX ⽅法, 可以允许我们绘制各种图 形.
QPaintDevice "画板". 描述了 QPainter 把图形画到哪个对象上. 像咱们之前⽤过的 QWidget 也 是⼀种 QPaintDevice (QWidget 是 QPaintDevice 的⼦类)
QPen "画笔". 描述了 QPainter 画出来的线是什么样的.
QBrush "画刷". 描述了 QPainter 填充⼀个区域是什么样的.

画图相关的操作,一般不会放到QWidget的构造函数中调用执行,而是提供了一个paintEvent事件处理函数,在这里进行调用。

第一步:重写paintEvent事件函数

在头文件中声明paintEvent函数

cpp 复制代码
void paintEvent(QPaintEvent *event);

在.cpp文件中定义该函数

cpp 复制代码
void Widget::paintEvent(QPaintEvent *event)
{
    //无实际意义,避免警告而已
    (void)event;
}

第二步:创建QPainter

cpp 复制代码
QPainter painter(this);

第三步:设置QPainter绘制的文字类型(非必须)

cpp 复制代码
QFont font("微软雅黑",24);
painter.setFont(font);

第四步:设置画笔属性(线条)

cpp 复制代码
    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::DashLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

第五步:设置画刷的属性(填充)

画刷的style取值可以如下,也就是填充效果

cpp 复制代码
//设置画刷属性
QBrush brush;
brush.setColor(QColor(0,0,255));
brush.setStyle(Qt::Dense5Pattern);
painter.setBrush(brush);

painter.drawEllipse(200,200,400,100);

如果要实现不同的填充效果,可以继续更改brush的style即可

效果如下:

第六步:开始绘制

绘制线段

void drawLine(const QPoint &p1, const QPoint &p2);
参数:
p1:绘制起点坐标
p2:绘制终点坐标

示例:

cpp 复制代码
    //创建QPainter对象
    QPainter painter(this);
    //设置QPainter绘制的字体属性
    QFont font("微软雅黑",24);
    painter.setFont(font);

    //设置画笔属性
    QPen pen;
    //设置成蓝色的线条
    pen.setColor(QColor(0,0,255));
    //设置线条的粗细
    pen.setWidth(5);
    //设置线条的风格
    pen.setStyle(Qt::SolidLine);
    //让painter对象应用pen对象
    painter.setPen(pen);

    //开始绘制
    painter.drawLine(100,100,200,100);

效果:

绘制矩形

void QPainter::drawRect(int x , int y , int width , int height ) ;
参数:
x:窗⼝横坐标;
y:窗⼝纵坐标;
width:所绘制矩形的宽度;
height:所绘制矩形的⾼度;

示例:

cpp 复制代码
    painter.drawRect(100,100,200,200);

效果:

绘制圆形

void QPainter::drawEllipse(const QPoint & center , int rx , int ry )
参数:
center:中心点坐标
rx:横坐标
ry:纵坐标

示例:

前两个参数指定圆心,后面两个参数指定外接矩形的宽度和高度

cpp 复制代码
    painter.drawEllipse(200,200,100,100);

效果

如果我们宽度或者高度不一样的话,他会产生一个椭圆的效果。

绘制文本

QPainter类 中不仅提供了绘制图形的功能,还可以使⽤ QPainter::drawText() 函数来绘制⽂字,也可以使⽤QPainter::setFont() 设置字体等信息。
这里的前两个参数,0横坐标表示的是文字最左侧的位置,100纵坐标表示的是文字的基线位置,所谓基线就是四线个中的第三条,如下:

示例:

cpp 复制代码
painter.drawText(0,100,"hello");

效果如下:

绘制图片

Qt 提供了四个类来处理图像数据:QImage、QPixmap、QBitmap 和 QPicture,它们都是常⽤的绘图设备。

  • QImage主要⽤来进行 I/O 处理,它对 I/O 处理操作进⾏了优化,⽽且可以⽤来直接访问和操作像素;
  • QPixmap 主要⽤来在屏幕上显⽰图像,它对在屏幕上显⽰图像进⾏了优化;
  • QBitmap是 QPixmap 的子类,⽤来处理颜⾊深度为1的图像,即只能显示黑白两种颜⾊;
  • QPicture ⽤来记录并重演 QPainter 命令

基础绘制

前两个参数为从哪个坐标开始绘制图案

cpp 复制代码
    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,pixmap);

缩放绘制

前两个参数还是与基础绘制一样,400和300 分别是缩放后图片的宽度和高度

cpp 复制代码
    QPixmap pixmap(":/background.jpg");
    painter.drawPixmap(100,100,400,300,pixmap);

图片旋转

图片旋转,本质上是把QPainter对象进行了旋转,绘制出来的内容也就产生了旋转。

旋转180度

painter.rotate(180);

这个旋转是绕着(0,0)坐标系原点进行的旋转,因此如果我们直接旋转的话,图像可能超出窗口,无法看到效果,所以我们还要进行平移 。

图片平移

这里我们平移是把坐标系原点(painter的起点)平移一下,这里是负的是因为我们之前将整个坐标系旋转了180度所以这里要平移到窗口内,需要取负值

painter.translate(-800,-600);

相关推荐
吴天德少侠12 分钟前
c++返回一个pair类型
开发语言·c++
ok!ko41 分钟前
设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)
java·开发语言·设计模式
学地理的小胖砸41 分钟前
【GEE的Python API】
大数据·开发语言·前端·python·遥感·地图学·地理信息科学
qq_317060952 小时前
java之http client工具类
java·开发语言·http
robot_大菜鸟2 小时前
python_openCV_计算图片中的区域的黑色比例
开发语言·python·opencv
Pandaconda3 小时前
【C++ 面试 - 新特性】每日 3 题(六)
开发语言·c++·经验分享·笔记·后端·面试·职场和发展
chanTwo_003 小时前
go--知识点
开发语言·后端·golang
悟空丶1233 小时前
go基础知识归纳总结
开发语言·后端·golang
北南京海3 小时前
【C++入门(5)】类和对象(初始类、默认成员函数)
开发语言·数据结构·c++
Mr_Xuhhh3 小时前
C语言深度剖析--不定期更新的第六弹
c语言·开发语言·数据结构·算法