【QT】绘图设备

news2024/11/28 22:44:26

绘图设备是指继承QPainterDevice的子类。Qt提供了很多这样的类,例如QPixmap、QBitmap、QImage和 QPicture。其中,

  1. QPixmap专门为图像在屏幕上的显示做了优化
  2. QBitmap是QPixmap的一个子类,它的色深限定为1,可以使用 QPixmap的isQBitmap()函数来确定这个QPixmap是不是一个QBitmap。(只有黑色和白色
  3. QImage专门为图像的像素级访问做了优化。
  4. QPicture则可以记录和重现QPainter的各条命令。

新建项目

QWidget类继承了QPaintDevice类,所有画家可以画画

QPixmap做绘图设备

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // QPixmap做绘图设备
    QPixmap pix(300, 300);                                  // 一张300*300的纸
    pix.fill(Qt::white);                                    // 填充
    QPainter painter(&pix);                                 // 向上面纸中画画
    painter.setPen(QPen(Qt::green));                        // 绿色的笔
    painter.drawEllipse(QPoint(150, 150), 100, 100);        // 画圆
    pix.save("D:\\code\\QT\\demo20\\pix.jpg");              // 存储

}

Widget::~Widget()
{
    delete ui;
}

效果

特点:对不同的平台做了显示的优化

QImage做绘图设备

    // QImage做绘图设备
    QImage img(300, 300, QImage::Format_RGB32);               // 一张300*300的纸
    img.fill(Qt::white);                                      // 填充
    QPainter painter(&img);
    painter.setPen(QPen(Qt::red));
    painter.drawEllipse(QPoint(150, 150), 100, 100);
    img.save("D:\\code\\QT\\demo20\\img.jpg");

效果

特点:专门为像素的访问做优化

利用image访问像素点,重写绘图事件

导入资源:【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客

头文件中有声明

// 利用image访问像素点,重写绘图事件
void Widget::paintEvent(QPaintEvent*)
{
    // 画出来
    QPainter painter(this);                 // 当前窗口
    QImage img;
    img.load(":/Image/Luffy.png");          // 加载

    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 100; j++) {
            // 设置像素点
            QRgb val = qRgb(255, 0, 0);
            img.setPixel(i, j, val);
        }
    }

    painter.drawImage(0, 0, img);           // 画路飞
}

效果

也可以读取像素点

// 利用image访问像素点,重写绘图事件
void Widget::paintEvent(QPaintEvent*)
{
    // 画出来
    QPainter painter(this);                 // 当前窗口
    QImage img;
    img.load(":/Image/Luffy.png");          // 加载

    for (int i = 0; i < 100; i++) {
        for (int j = 0; j < 100; j++) {
            // 设置像素点
//            QRgb val = qRgb(255, 0, 0);
            QRgb val = img.pixel(j, i);             // 读像素点
            img.setPixel(i, j, val);
        }
    }

    painter.drawImage(0, 0, img);           // 画路飞
}

效果

最后一个需要说明的是QPicture。这是一个可以记录和重现QPainter命令的绘图设备。 QPicture将QPainter的命令序列化到一个IO设备,保存为一个平台独立的文件格式。这种格式有时候会是“元文件(meta- files)”。Qt的这种格式是二进制的,不同于某些本地的元文件,Qt的pictures文件没有内容上的限制,只要是能够被QPainter绘制的元素,不论是字体还是pixmap,或者是变换,都可以保存进一个picture中。

QPicture是平台无关的,因此它可以使用在多种设备之上,比如svg、pdf、ps、打印机或者屏幕。回忆下我们这里所说的QPaintDevice,实际上是说可以有QPainter绘制的对象。QPicture使用系统的分辨率,并且可以调整 QPainter来消除不同设备之间的显示差异。

如果我们要记录下QPainter的命令,首先要使用QPainter::begin()函数,将QPicture实例作为参数传递进去,以便告诉系统开始记录,记录完毕后使用QPainter::end()命令终止。

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // QPicture做绘图设备  记录和重现画家的绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);            // 开始记录

    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150, 150), 100, 100);

    painter.end();
    pic.save("D:\\code\\QT\\demo20\\pic.zt");           // 自定义格式,打不开

}



// 利用image访问像素点,重写绘图事件
void Widget::paintEvent(QPaintEvent*)
{
    // 重现绘图指令
    QPicture pic;
    QPainter painter(this);
    pic.load("D:\\code\\QT\\demo20\\pic.zt");       // 加载
    painter.drawPicture(0, 0, pic);                 // 画出来
}

Widget::~Widget()
{
    delete ui;
}

效果

完整代码

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // QPixmap做绘图设备     对不同的平台做了显示的优化
//    QPixmap pix(300, 300);                                  // 一张300*300的纸
//    pix.fill(Qt::white);                                    // 填充
//    QPainter painter(&pix);                                 // 向上面纸中画画
//    painter.setPen(QPen(Qt::green));                        // 绿色的笔
//    painter.drawEllipse(QPoint(150, 150), 100, 100);        // 画圆
//    pix.save("D:\\code\\QT\\demo20\\pix.jpg");              // 存储



    // QImage做绘图设备   专门为像素的访问做优化
//    QImage img(300, 300, QImage::Format_RGB32);               // 一张300*300的纸
//    img.fill(Qt::white);                                      // 填充
//    QPainter painter(&img);
//    painter.setPen(QPen(Qt::red));
//    painter.drawEllipse(QPoint(150, 150), 100, 100);
//    img.save("D:\\code\\QT\\demo20\\img.jpg");


    // QPicture做绘图设备  记录和重现画家的绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);            // 开始记录

    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150, 150), 100, 100);

    painter.end();
    pic.save("D:\\code\\QT\\demo20\\pic.zt");           // 自定义格式,打不开

}



// 利用image访问像素点,重写绘图事件
void Widget::paintEvent(QPaintEvent*)
{
//    // 画出来
//    QPainter painter(this);                 // 当前窗口
//    QImage img;
//    img.load(":/Image/Luffy.png");          // 加载

//    for (int i = 0; i < 100; i++) {
//        for (int j = 0; j < 100; j++) {
//            // 设置像素点
            QRgb val = qRgb(255, 0, 0);
//            QRgb val = img.pixel(j, i);             // 读像素点
//            img.setPixel(i, j, val);
//        }
//    }

//    painter.drawImage(0, 0, img);           // 画路飞


    // 重现绘图指令
    QPicture pic;
    QPainter painter(this);
    pic.load("D:\\code\\QT\\demo20\\pic.zt");       // 加载
    painter.drawPicture(0, 0, pic);                 // 画出来
}

Widget::~Widget()
{
    delete ui;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1168519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安徽省黄山景区免9天门票为哪般?

今日浑浑噩噩地睡了大半天&#xff0c;强撑起身子写网文......可是&#xff0c;题材不好选&#xff0c;本“人民体验官”只得推广人民日报官方微博文化产品《这两个月“黄山每周三免门票”》。 图&#xff1a;来源“人民体验官”推广平台 因年事渐高&#xff0c;又有未愈的呼吸…

麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包

原文链接&#xff1a;麒麟KYLINIOS软件仓库搭建02-软件仓库添加新的软件包 hello&#xff0c;大家好啊&#xff0c;今天给大家带来麒麟桌面操作系统软件仓库搭建的文章02-软件仓库添加新的软件包&#xff0c;本篇文章主要给大家介绍了如何在麒麟桌面操作系统2203-x86版本上&…

改进YOLOv5 | 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器

改进YOLOv5 | 头部解耦 | 将YOLOX解耦头添加到YOLOv5 论文地址:https://arxiv.org/abs/2107.08430 文章目录 改进YOLOv5 | 头部解耦 | 将YOLOX解耦头添加到YOLOv51. 解耦头原理2. 解耦头对收敛速度的影响3. 解耦头对精度的影响4. 代码改进方式第一步第二步第三步第四步第五步本…

0-1背包 完全背包 + 至多/恰好/至少 + 空间优化 + 常见变形题

# capacity:背包容量 # w[i]: 第 i 个物品的体积 # v[i]: 第 i 个物品的价值 # 返回:所选物品体积和不超过 capacity 的前提下&#xff0c;所能得到的最大价值和 def zero_one_knapsack(capacity:int,w:List[int],v:List[int]) -> int:n len(w)cache #记忆化搜索 def dfs(i…

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…

使用C# 编写VISA相关的代码控制 keysight 34461A万用表

使用C# 编写VISA相关的代码控制 keysight 34461A万用表 1. 获取设备2. 开始编程2.1 创建项目2.2 编程2.3 全部工程代码 软件控制仪器仪表的教程在网上相对比较少&#xff0c;都是一段一段的代码&#xff0c;没有从头开始带初学者来进行操作的一个完整流程&#xff0c;整个方案难…

Unity中Shader的GI相关数据的准备

文章目录 前言一、把 Unity 中用到的 GI 的函数移植到我们自定义的 cginc 文件中二、开始使用和 GI 相关的方法1、了解 UnityGI 结构体的内容,并且准备 UnityGI 的数据2、了解 SurfaceOutput 结构体&#xff0c;并且准备数据3、了解并准备 UnityGIInput 结构体&#xff0c;并且…

Flutter笔记:发布一个模块 scale_design - (移动端)设计师尺寸适配工具

Flutter笔记 发布一个模块scale_design设计师尺寸适配工具与常用组件库 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/a…

词向量模型Word2Vec

Word2Vec CBOW连续词袋模型例子CBOW模型的embeddings层CBOW模型的线性层 总结 skip-gram跳字模型例子Skip-Gram模型的结构 CBOW和skip-gram的目标都是迭代出词向量字典&#xff08;嵌入矩阵&#xff09;——embeddings CBOW连续词袋模型 根据上下文词汇预测目标词汇 例子 使…

【FastCAE源码阅读3】几何模型显示:从OCC对象到VTK对象

从几何到显示还是比较麻烦的&#xff0c;需要将几何对象转换成渲染对象&#xff0c;涉及几何建模、面的三角化、图形渲染等学科&#xff0c;阅读本文需了解一些基本的OCC、VTK编程 一、几何体显示基本流程 FastCAE几何内核使用的是OCC&#xff0c;显示渲染用的VTK&#xff0c;…

Leetcode—111.二叉树的最小深度【简单】

2023每日刷题&#xff08;十八&#xff09; Leetcode—111.二叉树的最小深度 DFS实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ int minDepth(struct TreeNode* root…

NCL颜色索引表---全平台可用

NCL颜色索引表—全平台可用

三维向量旋转

三维向量旋转 问题描述问题分析 v ⃗ ∣ ∣ \vec{v}_{||} v ∣∣​的旋转 v ⃗ ⊥ \vec{v}_{\bot} v ⊥​的旋转 v ⃗ \vec{v} v 的旋转结论致谢 问题描述 如图1所示&#xff0c;设一个向量 v ⃗ \vec{v} v 绕另一个向量 u ⃗ [ x , y , z ] T \vec{u}[x,y,z]^{T} u [x,y,z]T…

【电路笔记】-相位差和相移

相位差和相移 文章目录 相位差和相移1、概述2、相位差2.1 同频信号2.2 电流与电压信号2.3 相似频率的信号 3、干扰4、总结 当我们听歌曲时&#xff0c;我们将正弦声音波形感知为音乐。 它们的振幅告诉我们信号有多大&#xff0c;频率告诉我们声音是低音还是高音。 然而&#xf…

vue学习part01

02_Vue简介_哔哩哔哩_bilibili Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org) 1.简介 2.常用用法 新项目一般vue3&#xff0c;老项目vue2 3.vue两种风格&#xff1a;选项式api&#xff08;vue2&#xff09;和组合式api&#xff08;vue3&#xff09; 两种方式实现累…

JS异常处理——throw和try、catch以及debugger

让我为大家介绍一下异常处理吧&#xff01; 异常处理是指预估代码执行过程中可能发生的错误&#xff0c;然后最大程度的避免错误的发生导致整个程序无法继续运行 throw 抛异常 第一种写法 function fun(x, y) {// undefined是false 但取反就是trueif (!x || !y) {// 第一种写…

实习记录--(海量数据如何判重?)--每天都要保持学习状态和专注的状态啊!!!---你的未来值得你去奋斗

海量数据如何判重&#xff1f; 判断一个值是否存在&#xff1f;解决方法&#xff1a; 1.使用哈希表&#xff1a; 可以将数据进行哈希操作&#xff0c;将数据存储在相应的桶中。 查询时&#xff0c;根据哈希值定位到对应的桶&#xff0c;然后在桶内进行查找。这种方法的时间复…

在线词典项目-项目介绍及框架搭建

项目介绍 通过代码实现词典的注册、登录、单词注释查询、历史查询、查询记录。 有道词典分析图 客户端流程图 注释&#xff1a;首先开始-->创建流式套接字-->连接服务器-->输入需要执行的命令代码-->创建循环&#xff0c;判断需要执行的函数&#xff08;如果登录…

基于深度学习的行人重识别(person reid) 计算机竞赛

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的行人重识别 该项目较为新颖&#xff0c;适合…

AIGC | 如何用“Flow”,轻松解决复杂业务问题

随着LLM&#xff08;大语言模型&#xff09;的爆火&#xff0c;不少企业都在寻找通过LLM解决企业业务问题的方法&#xff0c;以达到降本增效的效果。但是&#xff0c;当面对较为复杂的业务问题&#xff08;如&#xff1a;背景资料多、问题分类多、条件判断复杂、涉及模块多等&a…