Qt笔记——绘图(QBitmap,QPixmap,QImage,QPicture)

Stella981
• 阅读 717
  • QPainter绘图

    • 重写绘图事件,虚函数
    • 如果窗口绘图,必须放在绘图事件里实现
    • 绘图事件内部自动调用,窗口需要重绘的时候,状态改变
  • 绘图设备(QPixmap,QImage,QBitmap,QPicture)

  • QPixmap图片背景透明,针对屏幕进行优化了,和平台相关,不能对图片进行修改

  • QImage 和平台无关,可以对图片进行修改,在线程中绘图

  • QPicture 保存绘图 的状态(二进制文件)

  • pixmap.save("../pixmap.png"); 保存图片

  • setWindowFlags(Qt::FramelessWindowHint | windowFlags());去除边框

  • setAttribute(Qt::WA_TranslucentBackground);设置透明

QPainter

#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:
    void paintEvent(QPaintEvent *event);

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
    int x=0;
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPen>
#include <QBrush>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    //QPainter p(this);
    QPainter p;//创建画家对象
    p.begin(this);//指定当前窗口为绘图设备
    //画背景图
    //p.drawPixmap(0,0, width(), height(), QPixmap("../Image/bk.png"));
    //p.drawPixmap(rect(),QPixmap("../Image/bk.png"));

    //定义画笔
    QPen pen;
    pen.setWidth(5);//设置线宽
    pen.setColor(QColor(124,123,0));//rgb
    pen.setStyle(Qt::DashDotDotLine);

    QBrush brush;
    brush.setColor(Qt::red);
    brush.setStyle(Qt::Dense1Pattern);

    //p.setPen(pen);
    p.setBrush(brush);
    //画直线
    p.drawLine(50,50,150,50);
    p.drawLine(50, 50,50,150 );

    //画矩形
    p.drawRect(x,150,100,50);

    p.drawEllipse(QPoint(150,150),25,50);

    p.drawPixmap(x,180,80,80,QPixmap("../Image/face.png"));

    p.end();
}

void Widget::on_pushButton_clicked()
{
    x += 20;
    if(x>width())
    {
        x = 0;
    }
    update();
}

 QBitmap

#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:
    void paintEvent(QPaintEvent *event);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QBitmap>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    //QPixmap图片背景透明
    p.drawPixmap(0,0,QPixmap("../Image/butterfly.png"));
    //QBitmap
    p.drawPixmap(200,0, QBitmap("../Image/butterfly.png"));
    //QPixmap 图片背景白色
    QPixmap pixmap;
    pixmap.load("../Image/butterfly1.png");

}

 QPixmap

#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();

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    QPixmap pixmap(400, 300);
    QPainter p(&pixmap);
    p.fillRect(0,0,400,300,QBrush(Qt::white));

    pixmap.fill(Qt::white);
    p.drawPixmap(0,0,80,80,QPixmap("../Image/face.png"));

    //保存图片
    pixmap.save("../pixmap.png");
}

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

 QImage

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

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

    QImage image(400,300,QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);

    p.drawLine(50,50,100,100);

    for(int i=0;i<50;i++)
    {
        for(int j=0;j<50;j++)
        {
            image.setPixel(QPoint(i,j),qRgb(0,255,0));

        }
    }
    p.end();

    image.save("../image.png");
}

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

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);
    QPicture picture;
    QPainter p;
    p.begin(&picture);
    p.drawLine(50,50,100,100);
    p.end();

    picture.save("../picture.png");
}

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

void Widget::paintEvent(QPaintEvent *event)
{
//    QPicture pic;
//    pic.load("../picture.png");
    QPainter p(this);
//    p.drawPicture(0,0,pic);

    QPixmap pixmap;
    pixmap.load("../Image/face.png");
    QImage tempImage = pixmap.toImage();
    p.drawImage(0,0, tempImage);

    QImage image;
    image.load("../Image/face.png");
    QPixmap tempPixmap = QPixmap::fromImage(image);
}  

窗口透明

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());

    setAttribute(Qt::WA_TranslucentBackground);
}

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

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter p(this);
    p.drawLine(50,50,100,100);
}

void Widget::mousePressEvent(QMouseEvent *event)
{
    if(event->button() == Qt::RightButton)
    {
     close();
     qDebug()<<"close";
    }
    else if(event->button() == Qt::LeftButton)
    {
        p = event->globalPos() - this->frameGeometry().topLeft();
        qDebug()<<"left";
    }
}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(event->button() & Qt::LeftButton)
    {
            move(event->globalPos()-p);
    }
}
点赞
收藏
评论区
推荐文章
黎明之道 黎明之道
3年前
python数据分析与可视化——利用Seaborn进行绘图
利用Seaborn进行绘图下面例子中所用数据下载地址——Matplotlib绘图基本模仿MATLAB绘图库,其绘图风格和MATLAB类似。由于MATLAB绘图风格偏古典,因此,Python开源社区开发了Seabo
春风化雨 春风化雨
1年前
Sketch for mac(矢量绘图UI设计软件)
SketchMac版以简约的设计是基于无限的规模和层次的绘图空间,拥有调色板,面板,菜单,窗口和控件。虽然使用简单,它提供了功能强大的矢量绘图和文字工具。如完美的布尔运算,符号,和强大的标尺,参考线和网格。出自:Sketch拥有很棒的矢量工具以及基本的形状
布袋罗汉 布袋罗汉
1年前
Sketch 95.3(矢量绘图UI设计软件)
SketchMac版是一款非常优秀的矢量绘图工具,拥有简约的设计,调色板,面板,菜单,窗口,控件和功能强大的矢量绘图和文字工具;包含针对UI设计的操作和交互模式,让你设计图标、移动手机UI、网站UI等更加简单高效。此版本包括一些错误修复和调整!1、数字设计
Stella981 Stella981
3年前
HTML5中Canvas元素的使用总结
HTML5中Canvas元素的使用总结  Canvas提供了开发者自定义绘图的接口,我们可以公国getContext()函数来获取绘图上下文进行绘制操作,这个函数中可以传入两个参数,其中第1个参数设置绘图上下文的类型,比较常用的是"2d",我们也可以使用"webgl"来使用webOpenGL实现3D绘制。本篇博
Stella981 Stella981
3年前
Quartz2D绘图
绘图路径A.简单说明在画线的时候,方法的内部默认创建一个path。它把路径都放到了path里面去。1.创建路径 cgmutablepathref调用该方法相当于创建了一个路径,这个路径用来保存绘图信息。2.把绘图信息添加到路径里边。以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx默认会在内部创建一个pat
流浪剑客 流浪剑客
1年前
Sketch for Mac 97.2中文版
是一款适用于UI/UX设计、网页设计、图标制作等领域的矢量绘图软件,其主要特点如下:1.简单易用的界面设计:Sketch的用户界面简洁明了,使得用户可以轻松上手操作,不需要复杂的学习过程。2.强大的矢量绘图功能:Sketch提供了丰富的矢量绘图工具和特性,
公孙晃 公孙晃
1年前
Sketch for mac 97.2中文版
是一款适用于UI/UX设计、网页设计、图标制作等领域的矢量绘图软件,其主要特点如下:1.简单易用的界面设计:Sketch的用户界面简洁明了,使得用户可以轻松上手操作,不需要复杂的学习过程。2.强大的矢量绘图功能:Sketch提供了丰富的矢量绘图工具和特性,
赵融 赵融
8个月前
AutoCAD 2025 Mac下载:附软件安装包+图文详细教程
众所周知,AutoCAD是一款功能强大、使用人数众多的自动计算机辅助设计软件,用于二维绘图、详细绘制、设计文档和基本三维设计,现已经成为国际上广为流行的绘图工具,目前最新已推出2025版本。全新2025版本拥有着非常强大的渲染、绘图和三维打印功能,还提供了