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中需要我们自己使用双缓冲,否则在某些应用中就会出现闪烁。





  • 相关阅读:
    hibernate -- HQL语句总结
    Struts2文件上传的大小限制问题
    WZY社区
    MyEclipse2014 优化设置
    如何优化myeclipse.
    棋盘覆盖问题(算法分析)(Java版)
    java 十六进制颜色对照表
    sql server 2012 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值
    oracle 自定义聚合函数(MAX_O3_8HOUR_ND) 计算最大的臭氧8小时滑动平均值
    python 读取全国城市aqi数据,差值生成png图片
  • 原文地址:https://www.cnblogs.com/Romi/p/2435412.html
Copyright © 2011-2022 走看看