绘图的底层操作
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上。
相关文章
- 08-06虚拟机: 虚拟机win7的激活方式(底层操作系统 为 win10) ===用windows loader
- 08-06Qt中文件操作遇到的(变量,容器,结构体)
- 08-06QT 绘图设备的总结
- 08-06QT基础学习(10)---简单的绘图
- 08-06CASS操作之在房地一体绘图中的应用
- 08-06Qt 串口和线程的简单结合(通过子线程操作串口、movetothread)
- 08-06Qt — 子窗体操作父窗体中的方法
- 08-06QT5 关于object基类实现的多线程操作,movetothread方法的使用
- 08-06Tip2 Qt中判断当前的操作系统
- 08-06Qt中绘图坐标QPainter,Viewport与Window的关系