Qt 5.14.2 学习记录 —— 이십삼 绘图API

embedded/2025/2/6 0:43:51/

文章目录

  • 1、概念
  • 2、API


1、概念

Qt的各个控件本质是画出来的。有时候现有控件无法完成所需功能,那就用绘图API来自定义控件。

QPainter提供一系列的绘图方法
QPaintDevice表示用户画的要放到哪个设备上,QWidget是它的子列
QPen是画笔
QBrush是画刷,填充时的属性


画图相关操作是在paintEvent事件处理函数中调用的,还有一个QPaintEvent事件。

当控件放到QWidget中,QWidget首次创建后就会显示出对应的控件,此时就触发了QPaintEvent事件。

控件被遮挡,再解除遮挡时也会触发这个事件。

窗口最小化再还原会触发。

控件大小改变时会触发。

代码中调用repaint或update会触发。


2、API

创建QWidget项目

// widget.h#include <QWidget>
#include <QPainter>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent* event);private:Ui::Widget *ui;
};
void Widget::paintEvent(QPaintEvent *event)
{(void) event;   // 只是用来解除编译器警告// 绘图工作QPainter painter(this); // 这里的this表明绘制到哪个设备// 设置QPen来设置线条QPen pen;pen.setColor(QColor(255, 0, 0));// 线条粗细pen.setWidth(5);// 线条风格pen.setStyle(Qt::DashLine);// 给painter应用QPenpainter.setPen(pen);// 画刷// 画的图形内部填充时有不同形状QBrush brush;brush.setColor(QColor(0, 255, 0));//brush.setStyle(Qt::Dense1Pattern);brush.setStyle(Qt::CrossPattern);painter.setBrush(brush);// 画两条线段// 起点x1, y1, 终点x2, y2painter.drawLine(20, 20, 200, 20);painter.drawLine(QPoint(20, 100), QPoint(200, 100));// 画矩形// 参数为起点位置坐标, 宽度, 高度// 参数是const QRect& rpainter.drawRect(100, 100, 300, 200);// 画圆形// 参数为圆心, 宽度, 高度painter.drawEllipse(200, 200, 100, 100);// 通过font设置文字QFont font("微软雅黑", 18);painter.setFont(font);// 文字// 参数为坐标和文字内容, 横坐标是文字最左侧位置, 纵坐标是文字基线位置baselinepainter.drawText(0, 100, "文字");
}

绘制图片。共有四个类,QImage用来进行IO处理,可直接访问和操作像素,保存、传输、编辑图片;QPixmap在屏幕上显示图形;QBitmap是QPixmap子类,处理颜色深度为1的图像,也就是只能显示黑白两种颜色;QPicture记录并重演QPainter命令,比如回看录像。这里写QPixmap。

创建QWidget项目,创建qrc并保存好一个图片。

// widget.h#include <QWidget>
#include <QPainter>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent* event);private:Ui::Widget *ui;
};// widget.cppvoid Widget::paintEvent(QPaintEvent *event)
{QPainter painter(this);QPixmap pixmap(":/clouds.jpg");painter.drawPixmap(0, 0, pixmap);// 图片缩放// 参数为坐标, 缩放成多少像素*像素, pixmappainter.drawPixmap(100, 100, 400, 300, pixmap);// 图片旋转// 实际上是把QPainter对象进行了旋转, 绘制的内容也就旋转了painter.rotate(180);// 绕着0, 0坐标系原点进行的旋转// 旋转180其实是以窗口左上角为原点, 旋转到窗口外// 把坐标系原点(Painter起点)移动, 就能看到了painter.translate(-800, -600);painter.drawPixmap(100, 100, 400, 300, pixmap);
}

关于QPicture

QPicture pic;
QPainter painter;
painter.begin(&pic);
// painter操作
painter.end(&pic);
pic.save("path");// 重现
QPainter painter(this);
QPicture pic;
pic.load("path");
painter.drawPicture(0, 0, pic);

结束。


http://www.ppmy.cn/embedded/159886.html

相关文章

llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3

llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3 1. LLAMA_VOCAB_PRE_TYPE_DEEPSEEK3_LLM2. static const std::map<std::string, llm_chat_template> LLM_CHAT_TEMPLATES3. LLM_CHAT_TEMPLATE_DEEPSEEK_3References 不宜吹捧中国大语言模型的同时&#xff0c;又去贬低美国大语言…

CTFSHOW-WEB入门-命令执行71-77

题目&#xff1a;web 71 题目&#xff1a;解题思路&#xff1a;分析可知highlight_file() 函数被禁了&#xff0c;先想办法看看根目录&#xff1a;cvar_export(scandir(dirname(‘/’))); 尝试一下发现很惊奇&#xff1a;&#xff08;全是&#xff1f;&#xff09;这种情况我也…

新站如何快速获得搜索引擎收录?

本文来自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/8.html 新站想要快速获得搜索引擎收录&#xff0c;需要采取一系列有针对性的策略。以下是一些具体的建议&#xff1a; 一、网站内容优化 高质量原创内容&#xff1a; 确保网站内容原创、…

C++滑动窗口技术深度解析:核心原理、高效实现与高阶应用实践

目录 一、滑动窗口的核心原理 二、滑动窗口的两种类型 1. 固定大小的窗口 2. 可变大小的窗口 三、实现细节与关键点 1. 窗口的初始化 2. 窗口的移动策略 3. 结果的更新时机 四、经典问题与代码示例 示例 1&#xff1a;和 ≥ target 的最短子数组&#xff08;可变窗口…

【IoCDI】_方法注解@Bean

目录 1. 类注解的使用局限 2. 仅使用Bean注解 3. 五大注解配合使用Bean 3.1 使用方式1&#xff1a;getBean传参Bean类型 3.2 使用方式2&#xff1a;getBean传参Bean名称 3.3 使用方式3&#xff1a;getBean传参Bean名称类型 在上文中&#xff0c;已经介绍了五大类注解及ge…

SQL入门到精通 理论+实战 -- 在 MySQL 中学习SQL语言

目录 一、环境准备 1、MySQL 8.0 和 Navicat 下载安装 2、准备好的表和数据文件&#xff1a; 二、SQL语言简述 1、数据库基础概念 2、什么是SQL 3、SQL的分类 4、SQL通用语法 三、DDL&#xff08;Data Definition Language&#xff09;&#xff1a;数据定义语言 1、操…

64位的谷歌浏览器Chrome/Google Chrome

64位的谷歌浏览器Chrome/Google Chrome 在百度搜索关键字:chrome&#xff0c;即可下载官方的“谷歌浏览器Chrome/Google Chrome”&#xff0c;但它可能是32位的&#xff08;切记注意网址&#xff1a;https://www.google.cn/....&#xff0c; 即&#xff1a;google.cn&#xff…

HAO的Graham学习笔记

前置知识&#xff1a;凸包 摘录oiwiki 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为&#xff1a;对于给定集合 X&#xff0c;所有包含 X 的凸集的交集 S 被称为 X 的 凸包。 说人话就是用一个橡皮筋包含住所有给定点的形态 如图&#xff1a; 正题&#xff1a…