Qt——绘图

1.涉及类

QPainter  QPaintEngine QPaintDevice

作为绘图的使用者,只需要关注 QPainter 和 QPaintDevice

 

2.QPainter

使用 QPainter 进行绘图

常用API

setPen, setBrush, setDevice

Pen, Brush : 又有 setColor 、setStyle

 

3. QDevice

通过与 QDevice 的继承关系知道能在哪里绘图。

常见 绘图设备

QPixmap : 对屏幕显示进行优化,与平台相关

QBitmap : 继承与QPixmap,只有黑白两色,省资源。

QImage :与平台无关,能进行图片修改,能线程绘图

QPicture:二进制文件保存绘图状态。

    //绘图设备, 400*300
    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.jpg");
    //创建一个绘图设备,QImage::Format_ARGB32背景是透明
    QImage image(400, 300, QImage::Format_ARGB32);
    QPainter p;
    p.begin(&image);

    //绘图
    p.drawImage(0, 0, QImage("../Image/face.png"));

    //对绘图设备前50个像素点进行操作
    for(int i = 0; i < 50; i++)
    {
        for(int j = 0; j < 50; j++)
        {
            image.setPixel(QPoint(i, j), qRgb(0, 255, 0));
            //image.pixel(QPoint(i, j));
        }
    }

    p.end();

    image.save("../image.png");
    QPicture picture;
    QPainter p;
    p.begin(&picture);

    p.drawPixmap(0, 0, 80, 80, QPixmap("../Image/face.png"));
    p.drawLine(50, 50, 150, 50);

    p.end();

    //保存的是二进制文件
    picture.save("../picture.png");



    QPicture pic;
    pic.load("../picture.png"); //加载文件

    QPainter p(this);
    p.drawPicture(0, 0, pic);

QPixmap与QImage的互相转换

    QPainter p(this);
    QPixmap pixmap;
    pixmap.load("../Image/face.png");

    //QPixmap -> QImage
    QImage tempImage = pixmap.toImage();
    p.drawImage(0, 0, tempImage);


    QImage image;
    image.load("../Image/face.png");

    //QImage -> QPixmap
    QPixmap tempPixmap = QPixmap::fromImage(image);
    p.drawPixmap(100, 0, tempPixmap);

4.绘制无边框图片

重要API:

设置无边框

setWindowFlags 

setAttribute

globalPos

frameGeometry

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

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 *)
{
    QPainter p(this);
    p.drawPixmap(0, 0, QPixmap("../Image/sunny.png"));
}

void Widget::mousePressEvent(QMouseEvent *e)
{
    if(e->button() == Qt::RightButton)
    {
        //如果是右键
        close();
    }
    else if(e->button() == Qt::LeftButton)
    {
        //求坐标差值
        //当前点击坐标-窗口左上角坐标
        p = e->globalPos() - this->frameGeometry().topLeft();
    }
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
    if(e->buttons() & Qt::LeftButton)
    {
       move(e->globalPos() - p);
    }
}

 

上一篇:Cfree


下一篇:如何使用PyQt更新QGraphicsView中的QPixmap