Qt——绘图API

目录

关于绘图API

绘图API核心类

下面是基本绘图示例

绘制图片与绘画者旋转平移


关于绘图API

**我们在Qt中使用各种各样的控件把窗口变成我们想要的样子,其实就是在使用Qt封装的绘图API在屏幕上进行画图,本质上就是调用系统的绘图API。**因此,我们也可以使用Qt封装的绘图API画出Qt没有提供给我们的控件

绘图API如何使用倒是很明了,就是调用接口。但是我们应该把绘图的逻辑放在代码中的什么位置?构造函数吗?这是不正确。事实上,绘图逻辑应该被放在QPaintEvent事件对应的事件处理函数-paintEvent内。这是因为我们可能遇到如下情况:

  1. "我们打开多个应用窗口,这些窗口可能会重叠起来"
  2. "改变窗口大小,窗口中的内容就要随之改变"
  3. "点击'-'把窗口暂时关闭然后再打开"

这些种种情况都意味着在程序运行过程中我们不可能只绘制一次窗口就够了,而是基本一定会触发重新绘制,那么把绘制逻辑放在构造函数中明显不可以,应该是一但发生某事件,绘图逻辑就要执行一次。所以使用了事件机制。

上面那些情况(不止这些),即需要重新绘制窗口的情况,就会触发QPaintEvent事件,执行绘图逻辑


绘图API核心类

即:绘画者拿着画笔/画刷在画板上作画


下面是基本绘图示例

cpp 复制代码
void MainWindow::paintEvent(QPaintEvent* event)
{
    //这里的this参数不是指定对象树上的父对象,而是指定画板
    QPainter painter(this);

    //画线,参数分别是:起始位置的横纵坐标,终点的横纵坐标
    painter.drawLine(50,50,500,50);
    painter.drawLine(50,50,50,500);
    painter.drawLine(50,50,500,500);

    //画矩形,参数分别是:起始位置的横纵坐标,矩形的宽度和高度
    painter.drawRect(90,90,100,50);

    //画圆,参数分别是:圆心坐标和圆的外接矩形的宽度和高度
    painter.drawEllipse(200,200,200,200);

    //设置文本格式
    QFont font("微软雅黑",24);
    painter.setFont(font);
    //画文本,第一个参数是指文字最左侧距离窗口最左侧的距离,第二个参数是文本基线(英文格子的第三根线)距离窗口最上侧的距离而
    painter.drawText(QRect(100,200,900,600),"天行健,君子以自强不息");


    //使用画笔改变线条风格
    QPen pen;
    pen.setColor(QColor(255,0,0));
    pen.setWidth(5);
    pen.setStyle(Qt::DotLine);
    //给绘画者设置画笔
    painter.setPen(pen);
    //画虚线圆
    painter.drawEllipse(100,100,200,200);

    //创建一个画刷
    QBrush brush;
    brush.setColor(QColor(255,0,0));
    brush.setStyle(Qt::CrossPattern);
    //给绘画者设置画刷
    painter.setBrush(brush);
    //画填充圆
    painter.drawEllipse(50,50,100,100);
}

绘制图片与绘画者旋转平移

使用绘画者画一个图片:

cpp 复制代码
void MainWindow::paintEvent(QPaintEvent* event)
{
    //这里的this参数不是指定对象树上的父对象,而是指定画板
    QPainter painter(this);

    //创建一个图片对象
    QPixmap pixmap(":/x.png");

    //画一个图,前两个参数是横纵坐标
    painter.drawPixmap(100,100,pixmap);

}

绘制缩放后的图片:

cpp 复制代码
void MainWindow::paintEvent(QPaintEvent* event)
{
    //这里的this参数不是指定对象树上的父对象,而是指定画板
    QPainter painter(this);

    //创建一个图片对象
    QPixmap pixmap(":/x.png");
  
    //将图片缩放后绘制,中间两个参数是缩放后的图片大小
    painter.drawPixmap(100,100,100,100,pixmap);
}

让绘画者旋转180度:

cpp 复制代码
void MainWindow::paintEvent(QPaintEvent* event)
{
    //这里的this参数不是指定对象树上的父对象,而是指定画板
    QPainter painter(this);

    //创建一个图片对象
    QPixmap pixmap(":/x.png");

    //坐标系旋转180度
    painter.rotate(180);
    //坐标系向右,向下平移500
    painter.translate(-500,-500);
    //绘画图片
    painter.drawPixmap(100,100,pixmap);
}
相关推荐
小灰灰搞电子4 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
传奇开心果编程6 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
新时代牛马6 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob6 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
白山编程大哥7 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
shmily麻瓜小菜鸡8 小时前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
七夜zippoe8 小时前
为什么 2026 年每个 Java 团队都该懂 AI Agent
java·开发语言·人工智能
znnnk9 小时前
【Python】GUI 开发从入门到实战(三):PyQt/PySide 进阶之路
开发语言·python·pyqt
Despacito10069 小时前
Java后端性能探查工具速查表
java·开发语言
晊晌_h9 小时前
嵌入式从0到精通——Linux C|TCP 并发服务器实现方案详解
服务器·开发语言·tcp/ip