Qt---绘图和绘图设备

一、QPainter绘图

绘图事件        void paintEvent()
声明一个画家对象,OPainter painter(this)        this指定绘图设备
画线、画圆、画矩形、画文字
设置画笔QPen        设置画笔宽度、风格

设置画刷QBrush        设置画刷风格

代码示例:

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类

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

 void Widget::paintEvent(QPaintEvent *)
 {
     //实例化画家对象  this指定的是绘图的设备
     QPainter painter(this);

     //设置画笔
     QPen pen(QColor(255,0,0));

     //设置画笔风格
     pen.setStyle(Qt::DotLine);

     //设置画笔宽度
     pen.setWidth(3);

     //让画家使用这个笔
     painter.setPen(pen);

     //设置画刷-->填充颜色
     QBrush brush(Qt::cyan);

     //设置画刷风格
     brush.setStyle(Qt::Dense7Pattern);

     //让画家使用画刷
     painter.setBrush(brush);


    //画线
     painter.drawLine(QPoint(0,0),QPoint(100,100));

     //画圆   椭圆
     painter.drawEllipse(QPoint(100,100),50,50);

     //画矩形
     painter.drawRect(QRect(20,20,50,50));

     //画文字
     painter.drawText(QRect(10,200,150,50),"好好学习,天天向上");
 }

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

输出如下所示:

 

二、QPainter高级设置

抗锯齿        效率低
painter.setRenderHint(QPainter::Antialiasing);

对画家进行移动
        painter.translate(100,0);

        保存状态save
        还原状态restore

代码示例: 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类

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

 void Widget::paintEvent(QPaintEvent *)
 {

     /高级设置///
     QPainter painter(this);
//     painter.drawEllipse(QPoint(100,50),50,50);
//     //设置抗锯齿能力  效率低
//     painter.setRenderHint(QPainter::Antialiasing);
//     painter.drawEllipse(QPoint(200,50),50,50);

     //画矩形
     painter.drawRect(QRect(20,20,50,50));

     //移动画家
     painter.translate(100,0);

     //保存画家状态
     painter.save();

     painter.drawRect(QRect(20,20,50,50));

     painter.translate(100,0);

     //还原画家保存状态
     painter.restore();

     painter.drawRect(QRect(20,20,50,50));

 }

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

三、手动调用绘图事件

如果想手动调用绘图事件利用update()
利用画家画图片painter.drawPixmap( x, y,QPixmap(路飞))

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //绘图事件
    void paintEvent(QPaintEvent *);

    int posX = 0;

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类

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

    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX += 20;
        //如果要手动调用绘图事件 用update更新
        update();
    });
}

 void Widget::paintEvent(QPaintEvent *)
 {
     ///利用画家 画资源图片//
     QPainter painter(this);

     //如果超出屏幕从0开始
     if(posX > this->width())
     {
         posX = 0;
     }

     painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));
 }

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

输出如下所示:(当超出屏幕时从0开始)

利用定时器让其自动从左到右移动: 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类
#include<QTimer>

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

    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX += 20;
        //如果要手动调用绘图事件 用update更新
        update();
    });

    //实现自动让图片向右移动
    QTimer *timer = new QTimer(this);
    timer->start(10);
    connect(timer,&QTimer::timeout,[=](){
        posX++;
        update();
    });
}

 void Widget::paintEvent(QPaintEvent *)
 {
     ///利用画家 画资源图片//
     QPainter painter(this);

     //如果超出屏幕从0开始
     if(posX > this->width())
     {
         posX = 0;
     }

     painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));
 }

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

四、绘图设备

1. QPixmap Qlmage QBitmap(黑白色) QPicture Qwidget

2. QPixmap对不同平台做了显示的优化
        QPixmap pix( 300,300)
        pix.fill(填充颜色)
        利用画家往pix 上画画        QPainter painter( & pix)

        保存pix.save(“路径")

3. Qimage可以对像素进行访问
        使用和QPixmap,差不多 Qlmage img(300,300,Qlmage::Format_RGB32);

        其他流程和QPixmap一样
        可以对像素进行修改img.setPixel(i,j,value);

代码示例:

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

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

//    //Pixmap绘图设备 专门为平台做了显示的优化
//    QPixmap pix(300,300);

//    //填充颜色
//    pix.fill(Qt::white);

//    //声明画家
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("D:\\QT\\pix.png");

    //QImage绘图设备    可以对像素进行访问
    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);

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

    //保存
    img.save("D:\\QT\\img.png");
}

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

QPixmap和Qimage输出如下所示为:

                

Qimage修改像素点:

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

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

//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //利用QImage 对像素进行修改
    QImage img;
    img.load(":/image/Luffy.png");

    //修改像素点
    for(int i = 50; i < 100; i++)
    {
        for(int j = 50; j<100;j++)
        {
            QRgb value = qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
    }
    painter.drawImage(0,0,img);
}

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

输入对比如下所示: 

     

4. QPicture记录和重现绘图指令

        QPicture pic
        painter.begin(&pic);
        保存pic.save(任意后缀名)

        重现利用画家可以重现        painter.drawPicture(0,0,pic);

代码示例: 

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

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

    //QPicture绘图设备  可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);//开始往pic上画

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

    painter.end();//结束画画

    //保存到磁盘
    pic.save("D:\\QT\\pic.zt");
}

//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //重现绘图指令
    QPicture pic;
    pic.load("D:\\QT\\pic.zt");
    painter.drawPicture(0,0,pic);
}

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

输出如下所示: 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

买一手股指期货跌多少会爆仓?

当指数下跌导致持有的股指期货合约价值减少&#xff0c;而你的保证金账户中的资金不足以维持原有的保证金要求时&#xff0c;期货公司会要求你追加保证金&#xff0c;即所谓的“追加保证金通知”。如果投资者无法及时补足保证金&#xff0c;期货公司则有权强制平仓&#xff0c;…

【Linux】磁盘文件

思维导图 学习目标 了解磁盘的物理结构和存储结构&#xff0c;并将其存储结构进行抽象&#xff01;&#xff01; 一、了解一下磁盘及其物理结构 1.1 计算机只认识二进制 什么是二进制&#xff1f;&#xff1f;0&#xff0c;1是被规定出来的&#xff0c;在计算机里面我们用高低…

SAP 控制已转采购订单的PR不允许删除简介

SAP系统中采购申请当被转成采购订单后&#xff0c;在采购申请中会关联到对应已生生成的采购订单&#xff0c;如下图中可以看到采购申请对应的采购订单 当日常操作中用户在创建完采购申请后&#xff0c;当PR转成PO后仍然可以将采购申请的行项目进行删除&#xff0c;显然这个操作…

『拼多多、淘宝、抖音、小红书等卖家』4个有效动作,走出成单低谷期

对于拼多多、淘宝、抖音、小红书等平台的卖家来说&#xff0c;走出成单低谷期需要一系列有效的动作。以下是店雷达四个建议&#xff1a; 一、选品优化 1、深入市场研究&#xff1a;了解当前市场趋势、消费者需求和潜在的市场空白。使用各种工具&#xff0c;如店雷达选品功能&…

Python深度学习基于Tensorflow(2)Tensorflow基础

文章目录 基本操作数据转换和数据生成操作形状数据提取和保存变量Numpy和Tensorflow的比较 计算图静态图动态图自动图 自动微分使用Tensorflow 实现回归 首先是Tensorflow的安装&#xff0c;由于可能会出现版本冲突&#xff0c;最好在conda环境安装&#xff0c;同时&#xff0c…

华为OD机试 - 密码输入检测(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

leetcode经典例题之环形队列

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 目录 1、题目展示2、问题分析3、完整代码展示4、结语 1、题目展示 在拿到题目时&#xff0c;通…

前端动态旋转地球背景

效果图 贴下源码 <template><div class"map-bg"><div class"canvas" id"canvs"></div><canvas class"canvasxk" id"canv"></canvas></div> </template><script setup …

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 打开工具&#xff0c;切换到第五个模块&#xff0c;文件批量复制模块&#xff08;快捷键&#xff1a;Ctrl5&#xff09; 点击右边的“搜索添加”按钮&#…

20 分页:较小的表

目录 简单的解决方案&#xff1a;更大的页 混合方法&#xff1a;分页和分段 多级页表 详细的多级示例 超过两级 ​编辑地址转换过程&#xff1a;记住TLB 反向页表 将页表交换到磁盘 之前提到的一个问题&#xff1a;就是页表太大&#xff0c;假设一个 32 位地址空间&…

高中数学:平面向量-基本概念

一、定义 有方向&#xff0c;且有大小的量&#xff0c;就叫向量 与之对应的是&#xff0c;数量&#xff0c;只有大小&#xff0c;没有方向 例如 A B → \mathop{AB}\limits ^{\rightarrow} AB→ a → \mathop{a}\limits ^{\rightarrow} a→ 二、相关性质 相等 大小相同…

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件&#xff1a;将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上&#xff08;因安装exe4…

【必看】Spring系列面试题

Spring Core Container, AOP, Data Access, Web... 基础 1. 简单介绍Spring 一款开源的轻量级 Java 开发框架&#xff0c;旨在提高开发人员的开发效率以及系统的可维护性。Spring 支持 IoC&#xff08;Inversion of Control:控制反转&#xff09; 和 AOP(Aspect-Oriented Pro…

网络隔离状态下,如何可以安全高效地进行研发文件外发?

研发部门的数据传输通常需要保证数据的安全性、完整性和保密性&#xff0c;尤其是当涉及到公司的核心技术、产品设计、源代码等重要信息时。研发文件外发&#xff0c;即研发资料的外部传输&#xff0c;通常涉及到公司的核心技术和商业机密&#xff0c;因此需要采取严格的安全措…

动态NAT

在上一章静态NAT中我们提过了&#xff0c;静态NAT只能一对一映射&#xff0c;无法有效缓解IPV4地址池紧张的问题&#xff0c;那么我们今天来学习一个新的技术——动态NAT&#xff0c;来解决这个问题。 第一章 1.1 动态NAT工作流程 动态NAT基于地址池来实现私有地址和公有地址的…

学习软考----数据库系统工程师29

数据操作 SELECT基本结构 简单查询 连接查询 子查询 聚集函数 分组查询 字符串操作 集合操作 外连接 INSERT INTO语句 DELETE语句 UPDATE语句

融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A

SLM27211是高低边高频门极驱动器&#xff0c;集成了120V的自举二极管&#xff0c;支持高频大电流的输出&#xff0c;可在8V~17V的宽电压范围内驱动MOSFET&#xff0c;独立的高、低边驱动以方便控制&#xff0c;可用于半桥、全桥、双管正激和有源钳位正激等拓。有极好的开通、关…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

吴恩达2022机器学习专项课程C2(高级学习算法)W1(神经网络):Lab02 TensorFlow构建神经网络

这里写目录标题 实验目的导入训练集并绘制散点图特征缩放处理数据集扩展数据集TensorFlow构建神经网络模型1.设置模型的层2.获取模型信息2.优化模型3.设置模型参数3.开始预测4.转换预测结果 检测神经元的功能1.目的2.准备工作3.第一层的预测与真实数据的对比2.第二层3.神经网络…

【.net core】微信支付基础功能(开发及使用)

注意 微信开发前期准备工作参照&#xff1a;【微信开发】微信支付前期准备工作&#xff08;申请及配置&#xff09;-CSDN博客 本文仅提供微信支付下单&#xff0c;付款&#xff0c;回调&#xff0c;退款等基础功能内容&#xff0c;更多微信支付功能请参照微信支付官网:微信支…