QT绘图的底层操作

绘图的底层操作
LCD屏幕上的每个点都与显示缓冲区中的数据有特定的关系,对16位色的显示缓冲区,每两个字节对应LCD上的一个像素,因此我们只要修改缓冲区某两个地址上的数据就可以改变LCD上这个点的色彩,如果我们能够得到这个显示缓冲区的地址,应用程序编写者就可以抛开驱动程序那些抽象的接口,直接对显示缓冲区操作。Linux上有这种专门的驱动支持就是Framebuffer驱动程序,Framebuffer也就是帧缓冲,驱动程序创建一个缓冲区用做显示buffer。应用程序开发人员可以通过MMAP将Framebuffer设备重新映射,这样我们对LCD的操作就可以象操作一个二位数组一样方便。QT正是这么做的。
QWidget继承了QPaintDevice,通过graphicsContext接口,我们可以方便地得到这个窗体的设备上下文。这一过程是如何实现的呢?
QGfx * QWidget::graphicsContext(bool clip_children) const
{
    QGfx * qgfx_qws;
    qgfx_qws=qwsDisplay()->screenGfx(); //创建设备上下文
    updateGraphicsContext( qgfx_qws, clip_children );
    return qgfx_qws;
}
Qapplication调qt_get_screen( int display_id, const char *spec )来获得相应的驱动程序。创建驱动程序后调用qt_screen->connect将客户端与FrameBuffer即帧缓冲映射起来,具体代码可以参考QLinuxFbScreen 。当一个窗体就收到PaintEvent事件后就可以创建QPaint对象绘图,通过设备上下文获得的绘图接口实际上都是在对帧缓冲进行操作。 如果驱动程序不支持双缓冲操作的话,绘图的结果将直接显示在LCD上。

你可能感兴趣的:(Qt,GUI)