zoukankan      html  css  js  c++  java
  • Qt QPainter绘图原理

    Qt绘图要用到QPainter类,绘图的设备通常是主部件,也可以是QLabel部件或QTextEdit部件,通过一定的算法实现可以绘制出很漂亮的图形或我们需要的图形。

    绘制时需要先定义一个QPainter类对象,绘制可以选择的道具可以使Qpen(画笔)、QBrush(画刷)。使用QPen写文本时还可以指定字体(QFont类)

    如下面一段代码:

    QPanter painter;
    QPen pen;
    pen.setColor(QColor(255,0,0)); //设置画笔为红色
    painter.setPen(pen); //选择画笔
    painter.drawLine(0,0,100,100); //用该红色画笔画一条线,起点(0,0),终点(100,100)
    painter.end(); //结束绘制。绘制时使用的任何资源都被释放。虽然有时不需要调用end(),析构函数将会执行它

    其它的功能大同小异,参考Help文档,里面有各个方法的具体含义及参数意义。

    这里要说的是,绘图在什么时候发生,怎样更新绘制的视图。

    绘图时,需要重载QWidget类的paintEvent ( QPaintEvent * )方法,函数原型为

    void  QWidget::paintEvent ( QPaintEvent * ) [虚 保护]   该函数是受保护的虚函数,是绘制事件的函数,可以在派生类中被重新实现来接受绘制事件。

    所以使用时要现在类中声明paintEvent函数,然后在函数定义中实现图像的绘制。注意参数要写上QPaintEvent *event

    搞清楚这些后,我们就知道了,图形的绘制是在paintEvent这个函数中完成的,也就是说,不一定要把所有绘制的代码全写在paintEvent这个函数中(当然,很多教程都是这样写的,代码较长而且有一定框架时不建议这样),可以在外面的函数中实现,在paintEvent中调用相应的函数。

    然后我们需要弄清楚,什么时候绘制的问题,其实在使用类的对象的时候,如果类中重写了paintEvent事件,对象就会调用一次paintEvent函数,即定义对象时会调用该绘制事件。如果要完成图像重绘或刷新图像时怎么办呢?这就要使用repaint()或update()函数完成,这两个都是QWidget类的成员函数,派生类可以直接调用这两个函数进行窗口的擦除和绘制(注意是先擦除然后在绘制),即通过repaint()或updata()调用paintEvent事件。如果需要立即重新绘制,我们建议使用repaint(),但repiant()有个缺陷,因为倘若repaint()后paintEvent函数中要调用的函数中又有repaint(),就会陷入无限循环中,而updata()则不会出现此情况,因为updata()通过某一机制会让paintEvent事件只调用一次。在绝大多数情况下,update()更好,因为它允许Qt来优化速度并且防止闪烁。

    特别要注意一点,在绘制时,Qt在paintEvent事件中已经帮我们自动实现了双缓冲(X11系统需要手动去开启双缓冲),即绘制使用的就是双缓冲的方法,这与MFC有区别,MFC中需要我们自己使用双缓冲,否则在某些应用中就会出现闪烁。





  • 相关阅读:
    CNN comprehension
    Gradient Descent
    Various Optimization Algorithms For Training Neural Network
    gerrit workflow
    jenkins job配置脚本化
    Jenkins pipeline jobs隐式传参
    make words counter for image with the help of paddlehub model
    make words counter for image with the help of paddlehub model
    git push and gerrit code review
    image similarity
  • 原文地址:https://www.cnblogs.com/Romi/p/2435412.html
Copyright © 2011-2022 走看看