加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

利用qvfb模拟qt开发环境

(2012-08-22 15:05:29)
标签:

杂谈

分类: 嵌入式
1 关于QVFB
       Qvfb是为qtopia做的一个虚拟frambuffer的应用程序,它的最终目的就是把qtopia应用程序运行的的结果显示在qvfb上(实际中是 要通过linux的frambuffer驱动显示在lcd屏上的),并提供键盘、鼠标的外设仿真。从而方便研发阶段,用户在pc端就可以完成qtopia 的调试工作,极大的提高了工作效率
1 QVFB概述
Qvfb本身其实也是一个应用程序,qtopia也是一个应用程序,二者通过既定协议完成通信,如下图示。
http://blog.chinaunix.net/photo/61880_080518222301.jpg
更直观一点,如下图示。
http://blog.chinaunix.net/photo/61880_080518222315.jpg
Qpe和qvfb之间的通讯是基于既定的协议进行的,qpe和qvfb独立运行,它们处于不同的进程,它们之间以“共享内存”的方式完成通讯。

2 qpe端接口
Qtopia中server 端启动时,会调用QVFbScreen::connect()函数来连接到屏幕,这里qpe会创建一块共享内存,模拟framebuffer,用于图象的 输出,针对键盘鼠标分别创建两个文件,其名字由两个宏来决定,为QT_VFB_MOUSE_PIPE和QT_VFB_KEYBOARD_PIPE。
*关于图形绘制,qpe是通过QSCreen的派生类QVFbScreen来实现的,具体如下。
http://blog.chinaunix.net/photo/61880_080518222327.jpg
QSCreen定义了接口exposeRegion和blit,这两个函数会完成具体的绘制操作,不管是虚拟framebuffer还是真正的framebuffer,qtopia会将用于绘制的显示缓存映射到data变量,这样绘制操作就变成向data写数据了。
*关于鼠标
        Qtopia通过QVFbMouseHandler来完成,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。
*关于键盘
         Qtopia通过QVFbKeyboardHandler来实现,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。 
qvfb端介绍
Qvfb实际上是一个用qt实现的完整的应用程序,其架构层次图如下图示。


http://blog.chinaunix.net/photo/61880_080518222341.jpg

分别作如下阐述
3.1层次划分
   QVFb是主控件,可以理解为qvfb应用的主窗口Skin用来管理皮肤,QVFbView用于管理qpe绘制的窗口。QVFb、Skin、QVFbView三者属于应用框架层,管理应用程序的架构QVFbViewProtocol是协议层,它是一个虚类,具体实现了两个类QMMapViewProtocol和 QShMemViewProtocol,分别代表内存映射和共享内存,是两种实现linux上进程间通讯的方式,默认使用共享内存方式。协议层具体实现待 绘制数据的获取以及屏幕的更新。架构和实现分离,层次清晰。
3.2图形绘制
讲述屏幕图象绘制的流程
  • QShMemViewProtocol的构造函数

    创建共享内存,影射到hdr指针,分配显示区域的内存空间,影射到dataCache,建立timer 
    mRefreshTimer = new QTimer( this ); 
    connect( mRefreshTimer, SIGNAL(timeout()), this, SLOT(flushChanges()) ); 
    函数flushChanges会定期执行,它就是qvfb窗口绘制的源头。

  • QVFbView的构造函数

    mView = new QShMemViewProtocol(id, QSize(_w, _h), d, this);     connect(mView, SIGNAL(displayDataChanged(const QRect &)), 
            SLOT(refreshDisplay(const QRect &)));     将QShMemViewProtocol中的信号displayDataChanged绑定到QVFbView的槽函数refreshDisplay。 


  • 看看flushChanges函数的实现
void QShMemViewProtocol::flushChanges() {     // based of dirty rect, copy changes from hdr to hdrcopy     QRect r;            DisplayLock();         if (hdr->dirty) {             r = hdr->update;             hdr->dirty = false;             hdr->update = QRect();                                       memcpy(dataCache, ((char *)hdr) + hdr->dataoffset, displaySize);               emit displayDataChanged(r); } 可以看到该函数作两件事情,一是从共享内存中copy数据到dataChche,二是发出displayDataChanged信号。


  • 看看refreshDisplay函数的实现
void QVFbView::refreshDisplay(const QRect &r) {     if ( animation ) {            if ( r.isEmpty() ) {               animation->appendBlankFrame();            } else {               int l;               QImage img = getBuffer( r, l );               animation->appendFrame(img,QPoint(r.x(),r.y()));                   if ( !r.isNull() )        repaint(); }        该函数最终会触发paintEvent来完成绘制,绘制过程会通过协议层(也就是dataCache)来获取数据,最终绘制到窗口上。 
3.3 键盘鼠标
  • 关于skin

    Skin直接受鼠标事件,由mousePressEvent、mouseReleaseEvent负责。最终会调用协议层 QShMemViewProtocol中的QVFbMousePipe去发送鼠标事件,最终会写到协议规定的文件中去,qpe端通过读取该文件获取鼠标事 件。
  • 关于QVFbView

    会接受鼠标、键盘事件,由mousePressEvent、mouseReleaseEvent、keyPressEvent、 keyReleaseEvent。最终也是调用协议层QShMemViewProtocol中的QVFbMousePipe和 QVFbKeyPipeProtocol去发送鼠标、键盘事件,也就是写到既定的文件中,最终由qpe通过读取文件来获取鼠标、键盘事件。
关于qvfb的扩展
    扩展qvfb,使其能够支持audio和video,从而方便在pc端调试多媒体方面的模块,也可以脱离开发板,也提高开发效率。以上转载自:http://hyb757.blog.163.com/blog/static/3371910120095123192346/

二、获取QVFB
1、安装一个 qvfb ,在网上下了一个包 qvfb-1.0.tar.gz           # tar zxf qvfb-1.0.tar.gz
           # cd qvfb-1.0
           # ./configure  

          # make                         
          # make install
          然后就可以使用qvfb体验          # qvfb &
       2、从qt源码获得
         进入qvfb源码目录:
          # cd /home/src/qt-x11-opensource-src-4.4.3/tools/qvfb
       执行qmake生成pro工程:
         # /home/src/qt-x11-opensource-src-4.4.3/bin/qmake -project
       执行qmake生成Makefile
         # /home/src/qt-x11-opensource-src-4.4.3/bin/qmake 
       编译make
         # make           

     三、使用QVFB
使用qt-x86版本qmake生成的x86程序要在后面加上-qws才能在qvfb里面运行,具体使用以下面的实例说明。
[root@ayao lincom-build-desktop]# ./lincom -qws -qvfb -font wenquanyi
-font字体可以解决qvfb里面不能显示中文字体的问题,前提是要在x86版本的字体库里安装了相应的字体,字体设置如下:
export QTEDIR=/usr/local/Trolltech/QtEmbedded-4.7.3
export QT_QWS_FONTDIR=$QTDIR/lib/fonts

0

阅读 收藏 喜欢 打印举报/Report
前一篇:mfc  ontimer
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有