QT学习之绘图的总结

一笑奈何 提交于 2019-12-04 15:36:57

1、绘图的事件
 QBitmap   ---->   QPixmap  
 QBitmap继承于Qpixmap
两者的区别在于QBitmap用于画黑白图-------->优点:资源消耗小

而QPixmap在于画彩色图--------->缺点:资源消耗大

主要的过程:1、要有画家 2、和画图设备
在qt中为我们准备了三个类QPainter、QPaintEngine、QPaintDevice 我们通常只用到第一个和第三个
中间的一个在绘图过程中就已经被实现了------------->具体的详情等以后学通了在深究(一般只有qt设计人员会用到)


现在开始绘图:

1、首先重写绘图事件:
protected:
    void paintEvent(QPaintEvent*);
 //虚函数
注意事项:如果在窗口绘图,必须在绘图事件中实现
绘图事件内部自动调用,窗口需要重绘的时候(状态改变)----------->可能不理解,先接着往下看


2、画图片
QPainter p;
  p.begin(this);
  //p.drawPixmap(0,0,width(),height(),QPixmap("../325724.jpg"));   //在这里来解释一下自动调用的意思,当我们改变窗口的大小时,
  width(),height()都会自动的获取新窗口的大小
  p.drawPixmap(rect(),QPixmap("../325724.jpg"));//效果与   p.drawPixmap(0,0,width(),height(),QPixmap("../325724.jpg")); //一样
  p.end();
  -----------------------------------------------------------------------------------------------------------------------------
  QPainter p(this);
  p.drawPixmap(rect(),QPixmap("../325724.jpg"));   //简化后的版本,效果一样
  -------------------------------------------------------------------------------------------------------------------------------
3、画直线
  pen.setWidth(5);    //设置画笔的宽度
  pen.setColor(QColor(114,214,114));   //画笔的颜色
  p.setPen(pen);                  //将画笔给画家
  p.drawLine(100,100,50,50);  //画家开始画线
  --------------------------------------------------------------------------------------------------------------------------------
4、创建画刷
  QBrush brush;
  brush.setStyle(Qt::Dense1Pattern);
  brush.setColor(QColor(0,255,0));
  p.setBrush(brush);
  p.drawRect(rect());     //画刷的过程与画笔的一样的
  ----------------------------------------------------------------------------------------------------------------------------------
5 手动刷新界面----人为的重绘
  首先在ui中设置一个push按钮,然后在转到槽
  void Widget::on_pushButton_clicked()
 {
      x+=100;
      if((x+100)>width())
      {
         x=0;
      }
      update();
 }
 在槽中书写如上的函数-----------------------------------意思是点击一下push,x的值就加100,然后在更新窗口
 注意此时paintEvent函数中的写法是这样的
 QPainter p(this);
 p.drawPixmap(x,0,100,100,QPixmap("../325724.jpg"));------------------它们都通过--x---这个私有的变量联系在一起
  ---------------------------------------------------------------------------------------------------------------------------------------------------
6 QBitmap与QPixmap的比较
   QPainter p(this);
   p.drawPixmap(rect(),QBitmap("../325724.jpg"));  //黑白的图
   p.drawPixmap(rect(),QPixmap("../325724.jpg"));  //彩色的图
   -----------------------------------------------------------------------------------------------------------------------------------
7 现在再来看看画图设备
  QPixmap:主要用的是这个--优点:针对屏幕进行了优化,和平台相关----不可以对图片进行修改
  QImage:和平台无关,可以对图片进行修改(改变某个点的像素值)--在线程中绘图
  QPicture:保存绘图的状态(二进制文件)-----用于屏幕截图保存
8 QPixmap的使用
  QPixmap pixmap(400,400);
    pixmap.fill(Qt::white);
    QPainter p(&pixmap);
    p.drawPixmap(pixmap.rect(),QPixmap("../325724.jpg"));
    pixmap.save("1.jpg");
9 QImage的使用
   QImage imge(400,400,QImage::Format_ARGB32);
   QPainter p(&imge);
   p.drawImage(imge.rect(),QImage("../325724.jpg"));
   imge.save("2.png");
10 QPicture的使用----以二进制的形式保存,需要加载才能显示
    QPicture pic;
    QPainter p;
    p.begin(&pic);     //在这里要用到begin()与end的结合区加载,否则搞不出来
    p.drawPixmap(rect(),QPixmap("../325724.jpg"));
    p.end();           
    pic.save("3.jpg");
    ---------------------------------------------------------------------
    在paintEvent事件中的写法
    QPicture pic;
    pic.load("3.jpg");
    QPainter p(this);
    p.drawPicture(0,0,pic);
11 QImage与QPixmap之间的相互转换
    QPixmap pix;
    pix.load("../325724.jpg");
    QImage img=pix.toImage();
    QPainter p(this);
    p.drawImage(0,0,img);
----------------------------------------------------------------------
    QImage img;
    img.load("../325724.jpg");
    QPixmap pix=QPixmap::fromImage(img);    //要通过这个静态函数去进行转换
    QPainter p(this);
    p.drawPixmap(rect(),pix);
12 不规则的图形
    setWindowFlag(Qt::FramelessWindowHint);    //去掉边框
    setAttribute(Qt::WA_TranslucentBackground);  //设置窗口背景透明
    重写mouseMoveEvent与mousePressEvent两个函数实现窗口的可以移动
    void Widget::mousePressEvent(QMouseEvent *event)
   {
    if(event->button()==Qt::RightButton)
    {
        close();
    }
    else if(event->button()== Qt::LeftButton)
    {
        //求坐标差值
        p=event->globalPos()-this->frameGeometry().topLeft();   //event->globalPos()点击时相对屏幕的点,frameGeometry().topLeft()窗口左上方的点
    }
   }

   void Widget::mouseMoveEvent(QMouseEvent *event)
  {
    move(event->globalPos()-p);      //在这里要注意的是,我们的移动都是以窗口的左上方为基础的移动,因此要写成这个event->globalPos()-p
  }
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------over---------------------------------











标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!