• (十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap


    #include "widget.h"
    #include "ui_widget.h"
    #include <QPainter>
    #include <QFont>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        x = 20;
        ui->setupUi(this);
    
        connect(ui->move, &QPushButton::clicked, this, [=]()
        {
           // 刷新窗口
            update();   // 系统调用paintEvent 函数
        });
    }
    
    Widget::~Widget()
    {
        delete ui;
    }
    
    
    void Widget::paintEvent(QPaintEvent *)
    {
        // 创建画家类对象
        QPainter p(this);   // 指定绘图设备
    
    #if 0
        // 创建新画笔 -- 轮廓
        QPen pen;
        pen.setColor(/*Qt::green*/QColor(0, 255, 0));
        pen.setWidth(10);   // 像素
        pen.setStyle(Qt::DotLine);
    
        // 闭合区域使用画刷
        QBrush brush(QPixmap(":/Image/face.png"));
        p.setBrush(brush);
    
        // 将新画笔设置给画家类
        p.setPen(pen);
        // 画背景图
        p.drawPixmap(0, 0, QPixmap(":/Image/xks.png"));
    
        // 画直线
        p.drawLine(QPoint(100, 100), QPoint(300, 500));
    
        // 画椭圆
        p.drawEllipse(QPoint(200, 200), 100, 50);
    
        // 画矩形
        p.drawRect(400, 200, 200, 200);
    
        // 写字
        QFont font("华文彩云", 48, 75, true);
        p.setFont(font);
        p.drawText(100, 400, "我是中国人, 我爱我的祖国!!!");
    
        int width = this->width();
        int heght = this->height();
    #endif
        // 提供笑脸
        x += 5;
        if(x > this->width())
        {
            x = 20;
        }
        p.drawPixmap(x, 100, QPixmap(":/Image/sunny.png"));
    
    }
    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
    protected:
        /*
         *  1. 回调函数
         *  2. 此函数不需要用户与调用, 再刷新的时候会自定调用
         *      1. 窗口显示的时候
         *      2. 最大化, 最小化
         *      3. 窗口被这遮挡, 重新显示的时候
         *      4. 用户强制刷新的时候
         *      5. ...........
         *  3. 如果想使用画家类在窗口中画图, 操作必须在paintEvent函数中完成
        */
        void paintEvent(QPaintEvent *);
    
    private:
        Ui::Widget *ui;
        int x;
    };
    
    #endif // WIDGET_H

     QPixmap,QImage,QPicture

    #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);  // 纸的大小
        pix.fill(Qt::red);
        QPainter p(&pix);
        p.setPen(QPen(Qt::green, 10));
        p.drawRect(10, 10, 280, 280);
        p.drawEllipse(150, 150, 50, 50);
        pix.save("D:\mypixmap.png");
    
        // 指定绘图设备 1. 构造函数中(参数是绘图设备)
        // 2. begin(参数是绘图设备)
         //    end();
         // 在QImage中画图
        QImage img(300, 300, QImage::Format_RGB32);  // 纸的大小
        img.fill(Qt::red);
        p.begin(&img);
        p.setPen(QPen(Qt::green, 10));
        p.drawRect(10, 10, 280, 280);
        p.drawEllipse(150, 150, 50, 50);
        p.end();
        img.save("D:\myImage.png");
    
        // 在QPicture中画图
        // 1. 保存的是绘图步骤 -- 画家类
        // 2. 不是图片, 二进制文件(save保存生成的文件)
        // 3. 不依赖平台
       QPicture pic;  // 纸的大小
       p.begin(&pic);
       p.setPen(QPen(Qt::green, 10));
       p.drawRect(10, 10, 280, 280);
       p.drawEllipse(150, 150, 50, 50);
       p.end();
       pic.save("D:\mypic.aaa");
    }
    
    // QWidget
    // QPixmap QImage QPicture QBitmap(黑白图片)
    // QBitmap 父类 QPixmap
    // QPixmap -- 图片类, 主要用来显示, 它针对于显示器显示做了特殊优化, 依赖于平台的, 只能在主线程中使用(UI线程)
    // QIamge -- 图片类 , 不依赖有平台, (图片传输 , 可以在多线程中对其进行操作)
    Widget::~Widget()
    {
        delete ui;
    }
    
    void Widget::paintEvent(QPaintEvent *)
    {
        QPainter p(this);
        QPicture pic;
        pic.load("D:\mypic.png");
        p.drawPicture(100, 100, pic);
    }
    QPixmap:
        p.load("路径");———加载图片
        p.drawPixmap(b);
        a.专门为图像在屏幕上的显示做了优化,依赖于平台
        b.主要应用于平台上的图形显示,在不同的平台上拥有相同是显示效果
    QBitmap b;--
        p.drawPixmap(b)
        是QPixmap的一个子类,只显示黑白色
    QImage
        a.使用独立于硬件的绘制系统,专门为图像的像素级访问做了优化
        b.可以在多线程中使用
        c.可以修改图片中的任意一个像素值
    QPicture -- 二进制文件
        a.记录和重现QPainter 的各种命令
        b.与平台无关
        
    QPixmap 和 QImage 的直接相互转换
        1.QPixmap-->QImage:QPixmap::toImage()
        2.QImage-->QPixmap:QPixmap::fromImage() [static]
  • 相关阅读:
    序列信号发生器
    C++ | 虚函数初探
    Linux编程 | 使用 make
    [] CSDN-markdown编辑器语法——字体、字号与颜色
    Linux基础学习 | 用户及用户组
    Linux文件管理 | Liunx 常用命令
    Linux文件管理 | Linux 文件基础知识
    asp.net 可视化操作(二)——Sql数据库连接及简单查询功能的实现
    asp.net 可视化操作(一)——asp.net安装与使用
    Linux基础学习 | gcc、g++的安装和使用
  • 原文地址:https://www.cnblogs.com/xiangtingshen/p/10759584.html
Copyright © 2020-2023  润新知