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


    一。绘图的解释

            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.添加头文件

    1. #include
    2. #include

    2.绘图事件函数

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

    结果:

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

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

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

    用此事件刷新页面。

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

    1.绘图步骤

    1. //此函数响应后,用来刷新页面
    2. void Widget::paintEvent(QPaintEvent *event){
    3. //画家
    4. QPainter p;//制作画家对象
    5. p.begin(this);//画家在画板上画画(指定画在什么上)
    6. //画笔
    7. QPen pen;
    8. pen.setColor(Qt::red);//红色
    9. pen.setWidth(5);//宽度
    10. pen.setStyle(Qt::SolidLine);//实线
    11. //画笔交给画家
    12. p.setPen(pen);
    13. //画家画画
    14. p.drawRect(0,0,100,100);//画长方形
    15. //----------------------------------------
    16. //重新设置画笔
    17. pen.setColor(Qt::green);//设置画笔
    18. pen.setWidth(3);
    19. pen.setStyle(Qt::DotLine);
    20. p.setPen(pen);//画笔交给画家
    21. p.drawEllipse(150,150,100,100);//画椭圆
    22. //画完了
    23. p.end();
    24. }

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

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

    1.QPainter调用QBrush画画

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

    三。贴图

    贴图:

    1. QBitmap 和 QPixmap

                    QBitmap :黑白色

                    QPixmap :彩色

    2. QPixmap QImage Qpicture

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

    1.彩图,黑白图,动图

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

    代码:
     

    1. protected:
    2. void paintEvent(QPaintEvent *event);
    3. void timerEvent(QTimerEvent* e);
    4. private:
    5. Ui::Widget *ui;
    6. int x,y;
    1. Widget::Widget(QWidget *parent)
    2. : QWidget(parent)
    3. , ui(new Ui::Widget)
    4. {
    5. ui->setupUi(this);
    6. x=0;y=400;
    7. startTimer(100);
    8. }
    9. void Widget::timerEvent(QTimerEvent* e){
    10. x += 3;
    11. /*this->*/update();//当前控件产生重绘事件 paintEvent
    12. }
    13. //此函数响应后,用来刷新页面
    14. void Widget::paintEvent(QPaintEvent *event){
    15. QPainter p(this);
    16. p.drawPixmap(0,0,100,100,QPixmap("../0.png"));
    17. //p.drawPixmap(0,0,100,100,QBitmap("../0.png"));
    18. //p.drawPixmap(x,y,100,100,QPixmap("../0.png"));
    19. }

    2.QImage可以修改图片

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

    1. {
    2. ui->setupUi(this);
    3. QImage image(400,400,QImage::Format_ARGB32);
    4. QPainter p(&image);//QPainter p; p.begin(&image); p.end();
    5. p.drawImage(0,0,QImage("../0.png"));
    6. //QImage可以修改图
    7. QPen pen;
    8. pen.setColor(Qt::blue);
    9. p.setPen(pen);
    10. for(int i=0;i<20;i++){
    11. for(int j=0;j<20;j++){
    12. p.drawPoint(j,i);
    13. }
    14. }
    15. //保存
    16. image.save("../iamge0.png");
    17. }

    2.

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

    1. QPicture picture;
    2. QPainter p;
    3. p.begin(&picture);
    4. //等价
    5. /*
    6. QPainter p(&picture);
    7. */

    1.代码

    1. Widget::Widget(QWidget *parent)
    2. : QWidget(parent)
    3. , ui(new Ui::Widget)
    4. {
    5. ui->setupUi(this);
    6. QPicture picture;
    7. picture.save("../picture0.png");
    8. }
    9. void Widget::paintEvent(QPaintEvent *event){
    10. qDebug()<<"活着"<<endl;
    11. QPainter p(this);
    12. //picture类型图片
    13. QPicture pic;
    14. pic.load("../picture0.png");
    15. p.drawPixmap(100,100,100,100,QPixmap("../0.png"));
    16. p.drawPicture(0,0,pic);
    17. }

    保存成功

    错误:picture图片没有显示

    四。贴图的转换

    1. //pixmap 类型 和 image类型切换
    2. QPixmap pixmap;
    3. pixmap.load("../pixmapPaopao.png");
    4. QImage imgTemp = pixmap.toImage();
    5. p.drawImage(0,0,imgTemp);
    6. QImage image;
    7. image.load("../iamgePaopao.png");
    8. p.drawPixmap(400,400,QPixmap::fromImage(image));

    五。不规则贴图

    1.结果:

    2.步骤

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

    1. protected:
    2. void paintEvent(QPaintEvent *event);
    3. void mouseMoveEvent(QMouseEvent *event);
    4. void mousePressEvent(QMouseEvent *event);
    5. private:
    6. Ui::Widget *ui;
    7. QPoint pos;

    1. Widget::Widget(QWidget *parent)
    2. : QWidget(parent)
    3. , ui(new Ui::Widget)
    4. {
    5. ui->setupUi(this);
    6. setWindowFlags(Qt::FramelessWindowHint | windowFlags());//去掉边框
    7. //设置窗口背景透明
    8. setAttribute(Qt::WA_TranslucentBackground);
    9. }
    10. void Widget::mousePressEvent(QMouseEvent *event){
    11. if(event->button() == Qt::LeftButton){
    12. // 鼠标坐标 - 窗口左上角的点的坐标
    13. pos = event->globalPos() - this->frameGeometry().topLeft();
    14. }else if(event->button() == Qt::RightButton){
    15. //右键按下,关闭
    16. close();
    17. }
    18. }
    19. void Widget::mouseMoveEvent(QMouseEvent *event){
    20. if(event->buttons() & Qt::LeftButton){
    21. move(event->globalPos() - pos);
    22. }
    23. }
  • 相关阅读:
    Jupyter Notebook修改默认浏览器方法
    【web-攻击用户】(9.6.1)其他客户端注入攻击:HTTP消息头、cookie
    AI二次开发C#分组
    Huggingface网页解析和下载爬虫
    MySQL权限
    AndroidStudio案例——图书列表
    在x86的Docker中构建TVM的ARM环境
    缺陷检测相关论文阅读总结(记录自己读过的论文主要内容/Ideas)
    本地生活小程序有什么功能_本地生活小程序的优势
    filebeat(8.9.0)采集日志到logstash,由logstash发送的es
  • 原文地址:https://blog.csdn.net/m0_61659911/article/details/138120698