【QT】绘图设备

绘图设备是指继承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.rhkb.cn/news/179476.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用工具+迅雷解决ESP32配置下载问题

因为一些原因下载git上内容相当缓慢或都根本无法下载所以写了一个工具获取链接并使用迅雷下载。 工具下载&#xff1a;【免费】使用迅雷下载开发板工具资源-CSDN文库

分享77个工作总结PPT,总有一款适合您

分享77个工作总结PPT&#xff0c;总有一款适合您 PPT下载链接&#xff1a;https://pan.baidu.com/s/1qdoA_Ylbxkmp2Qkh9VDw8A?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 水彩插画风幼儿说课PPT模板 舞龙舞狮文化传承通…

【前端设计】HTML+CSS+JavaScript基本特性

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

小程序使用echarts(超详细教程)

小程序使用echarts第一步就是先引用到小程序里面&#xff0c;可以直接从这里下载 文件很多&#xff0c;我们值下载 ec-canvas 就好&#xff0c;下载完成后&#xff0c;直接放在pages同级目录下 index.js 在我们需要的页面的 js 文件顶部引入 // pages/index/index.js impor…

BUUCTF RSA4

BUUCTF RSA4 下载题目&#xff0c;可见文件给出了3组n和c N 331310324212000030020214312244232222400142410423413104441140203003243002104333214202031202212403400220031202142322434104143104244241214204444443323000244130122022422310201104411044030113302323014101…

从零开始的目标检测和关键点检测(三):训练一个Glue的RTMPose模型

从零开始的目标检测和关键点检测&#xff08;三&#xff09;&#xff1a;训练一个Glue的RTMPose模型 一、重写config文件二、开始训练三、ncnn部署 从零开始的目标检测和关键点检测&#xff08;一&#xff09;&#xff1a;用labelme标注数据集 从零开始的目标检测和关键点检测…

Java自学第1课:安装JDK+Eclipse

1 引言 在学习前&#xff0c;我想说一句&#xff0c;那就是为什么要学习Java。 每个人的出发点都不同&#xff0c;对于做信息化的工程技术人员来说&#xff0c;java不懂&#xff0c;就没法干项目。 尽管有c和matlab等基础&#xff0c;但java看起来与这些语言都不太一样。 做…

PXI-6608 185745H-02 PXI-6527 185633D-01

PXI-6608 185745H-02 PXI-6527 185633D-01 人工智能技术并不新鲜&#xff0c;但运行它的数据和计算却很新鲜 对于那些对人工智能技术历史感兴趣的人来说&#xff0c;一些今天正在使用的技术从20世纪50年代和60年代就已经存在了。 但是&#xff0c;如果人工智能已经存在了这么…

智能电表瞬时电量是什么意思?

智能电表已经成为我们进行能源管理的重要工具。其中&#xff0c;瞬时电量这一概念逐渐走进大众视野。那么&#xff0c;智能电表瞬时电量究竟是什么意思&#xff1f;它对我们的生活和能源管理又有哪些影响呢&#xff1f;下面&#xff0c;小编就来为大家介绍一下瞬时电量&#xf…

安卓毕业设计:基于安卓Android的仓库货物管理app

项目介绍 本文介绍了仓库货物管理APP软件开发建设的意义和国内外发展现状&#xff0c;然后详细描述了所开发手机APP的可行性分析&#xff0c;并分析了手机APP所要实现的功能。因为仓库货物管理设施较多&#xff0c;而且人口密集&#xff0c;不能更好的管理仓库货物&#xff0c…

django毕业设计基于python企业资产管理系统

项目介绍 本文首先介绍了企业资产管理系统的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根据需求分析制定模块并设计数据库结构&#xff0c;再根据系统总体功能模块的设计绘制系统的功能模块图&…

【LeetCode刷题-链表】--146.LRU缓存

146.LRU缓存 方法一&#xff1a;哈希表双向链表 使用一个哈希表和一个双向链表维护所有在缓存中的键值对 双向链表按照被使用的顺序存储了这些键值对&#xff0c;靠近头部的键值对是最近使用的&#xff0c;而靠近尾部的键值对是最久使用的哈希表即为普通的哈希映射&#xff0…

文心一言 VS 讯飞星火 VS chatgpt (127)-- 算法导论11.2 2题

二、用go语言&#xff0c;位向量(bit vector)是一个仅包含0和1的数组。长度为m的位向量所占空间要比包含m个指针的数组少得多。请说明如何用一个位向量来表示一个包含不同元素(无卫星数据)的动态集合。字典操作的运行时间应为 O(1)。 文心一言&#xff0c;代码正常运行&#x…

HTML5+CSS3+JS小实例:简约的黑色分页

实例:简约的黑色分页 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content="…

【计算机网络】数据链路层——以太网协议

目录 1.完整的数据传输流程2.以太网以太网通信原理以太网帧格式MAC地址对比MAC地址和IP地址MTU 3.ARP协议ARP协议的作用ARP协议的格式ARP协议的原理 1.完整的数据传输流程 IP拥有将数据跨网络从一台主机送到另一台主机的能力&#xff0c;但IP并不能保证每次都能够将数据可靠的送…

docker中安装rabbitMq并配置启动

目录 1. 拉取镜像并安装&#xff08;此处实例安装的是最新版&#xff09;2.查看docker中已安装的镜像和版本3.启动RabbitMq4.配置管理端5.安装完成 1. 拉取镜像并安装&#xff08;此处实例安装的是最新版&#xff09; docker pull rabbitmq2.查看docker中已安装的镜像和版本 …

06、如何将对象数组里 obj 的 key 值变成动态的(即:每一个对象对应的 key 值都不同)

1、数据情况&#xff1a; 其一、从后端拿到的数据为&#xff1a; let arr [1,3,6,10,11,23,24] 其二、目标数据为&#xff1a; [{vlan_1: 1, value: 1}, {vlan_3: 3, value: 1}, {vlan_6: 6, value: 1}, {vlan_10: 10, value: 1}, {vlan_11: 11, value: 1}, {vlan_23: 23, v…

linux环境下编译,安卓平台使用的luajit库

一、下载luajit源码 1、linux下直接下载&#xff1a; a、使用curl下载&#xff1a;https://luajit.org/download/LuaJIT-2.1.0-beta3.tar.gz b、git下载地址&#xff1b;https://github.com/LuaJIT/LuaJIT.git 2、Windows下载好zip文件&#xff0c;下载地址&#xff1a;https…

银河麒麟x86版、银河麒麟arm版操作系统编译zlmediakit

脚本 # 安装依赖 gcc-c.x86_64 这个不加的话会有问题 sudo yum -y install gcc gcc-c libssl-dev libsdl-dev libavcodec-dev libavutil-dev ffmpeg git openssl-devel gcc-c.x86_64mkdir -p /home/zenglg cd /home/zenglg git clone --depth 1 https://gitee.com/xia-chu…