【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡),简单绘图工具制作

发布于:2024-04-25 ⋅ 阅读:(31) ⋅ 点赞:(0)

一。绘图的解释

        Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。

        QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDevice、QWidget 和QPaintDevice 显示图形(线、形状、渐变等)、文本和图像。
        QPaintDevice 不直接绘制物理显示画面,而利用逻辑界面的中间媒介。例如,绘制矩形图形时,为了将对象绘制到 QWidget、QGLPixelBuffer、QImage、QPixmap、QPicture 等多种界面中间,必须使用 QPaintDevice。
        QPaintEngine 提供了一些接口,可用于 QPainter 在不同的设备上进行绘制。       

        绘图系统由 QPainter 完成具体的绘制操作,QPainter 类提供了大量高度优化的函数来完成 GUI 编程所需要的大部分绘制工作。它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,例如:点、线、矩形、弧形、饼状图、多边形、贝塞尔弧线等。此外,QPainter 也支持一些高级特性,例如反走样(针对文字和图形边缘)、像素混合、渐变填充和矢量路径等,QPainter 也支持线性变换,例如平移、旋转、缩放。

        QPainter 可以在继承自 QPaintDevice 类的任何对象上进行绘制操作。QPainter 也可以与QPrinter 一起使用来打印文件和创建 PDF 文档。这意味着通常可以用相同的代码在屏幕上显示数据,也可以生成打印形式的报告。

        QPainter 一般在部件的绘图事件 paintEvent() 中进行绘制,首先创建 QPainter 对象,然后进行图形的绘制,最后记得销毁 QPainter 对象。当窗口程序需要升级或者重新绘制时,调用此成员函数。使用 repaint()和 update() 后,调用函数 paintEvent()。

补充:绘图可看成画板,画布,画家,画笔,画刷组成。


————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/liang19890820/article/details/51154216

二。绘图具体功能演示

1.绘图事件paintEvent(QPaintEvent *event)

1.添加头文件

#include <QPainter>
#include <QPaintEvent>

2.绘图事件函数

void Widget::paintEvent(QPaintEvent *event){
    static int n=0;
    qDebug()<<n++<<endl;
}

结果:

        1.拖动窗口:不触发事件

        2.放大缩小窗口:触发事件

        3.隐藏显示窗口:触发事件

用此事件刷新页面。

2.使用QPainter绘图(使用画笔Qpen)

1.绘图步骤

//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    //画家
    QPainter p;//制作画家对象
    p.begin(this);//画家在画板上画画(指定画在什么上)
    //画笔
    QPen pen;
    pen.setColor(Qt::red);//红色
    pen.setWidth(5);//宽度
    pen.setStyle(Qt::SolidLine);//实线
    //画笔交给画家
    p.setPen(pen);
    //画家画画
    p.drawRect(0,0,100,100);//画长方形
    //----------------------------------------
    //重新设置画笔
    pen.setColor(Qt::green);//设置画笔
    pen.setWidth(3);
    pen.setStyle(Qt::DotLine);
    p.setPen(pen);//画笔交给画家
    p.drawEllipse(150,150,100,100);//画椭圆
    //画完了
    p.end();
}

2.使用QPainter创建画家,给他材料去画画

2.使用QPainter绘图(使用画刷QBrush)

1.QPainter调用QBrush画画

//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    //画家
    QPainter p;//制作画家对象
    p.begin(this);//画家在画板上画画(指定画在什么上)
    //制作画刷
    QBrush brush;
    brush.setColor(QColor(0,255,255));
    brush.setStyle(Qt::Dense1Pattern);
    p.setBrush(brush);
    p.drawRect(200,100,100,100);
    //画完了
    p.end();
}

三。贴图

贴图:

  1. QBitmap 和 QPixmap

                QBitmap :黑白色

                QPixmap :彩色

2. QPixmap QImage Qpicture

  1. QPixmap 适应不同平台 不能改 保存成各种各样的格式的图片文件
  2. QImage  不适应平台   可以修改内容   保存成各种各样的格式的图片文件
  3. QPicture  保存成二进制文件

1.彩图,黑白图,动图

1.创建时间事件timerEvent与绘图事件paintEvent

代码:
 

protected:
    void paintEvent(QPaintEvent *event);
    void timerEvent(QTimerEvent* e);
private:
    Ui::Widget *ui;
    int x,y;
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    x=0;y=400;
    startTimer(100);
}
void Widget::timerEvent(QTimerEvent* e){
    x += 3;
    /*this->*/update();//当前控件产生重绘事件   paintEvent
}
//此函数响应后,用来刷新页面
void Widget::paintEvent(QPaintEvent *event){
    QPainter p(this);
    p.drawPixmap(0,0,100,100,QPixmap("../0.png"));
    //p.drawPixmap(0,0,100,100,QBitmap("../0.png"));
    //p.drawPixmap(x,y,100,100,QPixmap("../0.png"));
}

2.QImage可以修改图片

1.使用QPainter画家画Qimage图,并且在上面画一些点

{
    ui->setupUi(this);
    QImage image(400,400,QImage::Format_ARGB32);
    QPainter p(&image);//QPainter p;  p.begin(&image);   p.end();

    p.drawImage(0,0,QImage("../0.png"));
    //QImage可以修改图
    QPen pen;
    pen.setColor(Qt::blue);
    p.setPen(pen);
    for(int i=0;i<20;i++){
        for(int j=0;j<20;j++){
            p.drawPoint(j,i);
        }
    }
    //保存
    image.save("../iamge0.png");
}

2.

3.QPicture保存图片为二进制文件

    QPicture picture;
    QPainter p;
    p.begin(&picture);
//等价
    /*
        QPainter p(&picture);
    */

1.代码

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

    QPicture picture;
    picture.save("../picture0.png");
}
void Widget::paintEvent(QPaintEvent *event){
    qDebug()<<"活着"<<endl;
    QPainter p(this);
    //贴 picture类型图片
    QPicture pic;

    pic.load("../picture0.png");
    p.drawPixmap(100,100,100,100,QPixmap("../0.png"));
    p.drawPicture(0,0,pic);
}

保存成功

错误:picture图片没有显示

四。贴图的转换

    //pixmap 类型 和 image类型切换
     QPixmap pixmap;
     pixmap.load("../pixmapPaopao.png"); 
     QImage imgTemp = pixmap.toImage();
     p.drawImage(0,0,imgTemp);
 
     QImage  image;
     image.load("../iamgePaopao.png");
     p.drawPixmap(400,400,QPixmap::fromImage(image));

五。不规则贴图

1.结果:

2.步骤

创建事件,鼠标按下事件,鼠标移动事件,绘图事件。创建一个点属性。

protected:
    void paintEvent(QPaintEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);
private:
    Ui::Widget *ui;
    QPoint pos;

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint | windowFlags());//去掉边框
    //设置窗口背景透明
    setAttribute(Qt::WA_TranslucentBackground);
}
void Widget::mousePressEvent(QMouseEvent *event){
    if(event->button() == Qt::LeftButton){
        //     鼠标坐标           -        窗口左上角的点的坐标
        pos = event->globalPos() - this->frameGeometry().topLeft();
    }else if(event->button() == Qt::RightButton){
        //右键按下,关闭
        close();
    }
}
void Widget::mouseMoveEvent(QMouseEvent *event){
    if(event->buttons() & Qt::LeftButton){
        move(event->globalPos() - pos);
    }
}

 六。简单绘图工具制作

结果:

1.两个按钮

2.widget。h

3.widget。cpp

鼠标按下事件

鼠标移动事件

鼠标释放事件

绘图事件


网站公告

今日签到

点亮在社区的每一天
去签到