QT绘图底层是如何适配各种操作系统的 您所在的位置:网站首页 opengl底层是调用gdi吗 QT绘图底层是如何适配各种操作系统的

QT绘图底层是如何适配各种操作系统的

2023-11-28 23:50| 来源: 网络整理| 查看: 265

OpenGl是会直接连接显卡驱动,可以间接操作显卡,自然跟是什么系统没什么关系,适配的是显卡驱动。那Qt是如何做的呢,Qt在绘图时是如何适配各种操作系统的?关于这些疑问在网上找到了一些回答

1.QT在不同的系统平台调用不同的系统接口

QT的底层,是用各种OS的界面库(而不是绘图库)适配出来的,这使得QT在不同的OS上看上去都和那个平台原生的应用风格一样。 Linux下有GTK Gome X-Window等等,Windows有Windows API。 OpenGL并不是必须的,要知道,很多早期的,没有3d加速特性的显示卡(甚至直到今天服务器上还有ATi的某些显卡)是根本不支持OpenGL硬件规范的。

 

qt只有某些widget是跟opengl相关的,但是如果你不需要画3D的内容,qt也不需要opengl支持。但是假如你要写一个画图程序,那你还得要用到这部分类了。

Qt只是封装了操作系统的窗口API,用Qt来编写程序你可以不用管系统API了,Qt帮你转接到了系统API了,不同的系统调用不同的函数。但是你看到的 Qt接口是一致的,内部你不用管了!

一般情况下,qt 对于desktop OS的支持还是不错的,你用qt写的程序基本上很容易在windows,linux, MacOSX上面跑,但是android,qnx等这些系统有很多功能还没有做好哦

2.通过驱动间接操作缓存(linux)

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上。   

参考资料:https://ask.csdn.net/questions/167856

https://blog.csdn.net/songjinshi/article/details/6544576



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有