不同水温时水的粘度表:安装qvfb

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 16:47:00

安装qvfb

(2008-04-27 18:46:38)

首先,修改你的 /etc/ld.so.conf文件,在里面最后新加入一行 /usr/local/lib
然后执行 [Root]#  ldconfig
[Root]# vi /usr/local/etc/MiniGUI.cfg
在里面找到
[system]
# GAL engine
#gal_engine=fbcon
gal_engine=qvfb  //修改
# IAL engine
#ial_engine=console
ial_engine=qvfb   //修改

mdev=/dev/mouse

mtype=IMPS2

[fbcon]

defaultmode=1024x768-16bpp

[qvfb]

defaultmode=640x480-16bpp   //这里修改为自己想要的参数
display=0

gal_engine和ial_engine的值应该设置为qvfb,minigui安装后默认设置就是fbcon,所以你要改过来。
另外要注意[qvfb]段中的defaultmode,这个是你需要使用的显示器分辨率和色深,
后面设置qvfb要和这里一致,否则minigui运行时或报初始化失败的错误。
保存一下,OK了!


现在需要安装一个 qvfb ,在网上下了一个包qvfb-1.0.tar.gz


# tar zxf qvfb-1.0.tar.gz
# cd qvfb-1.0
#./configure                  ///因为我用的redhat9.0没有把软件安全,开始安装时出现了很多错误,
#make                        /// 后来我一气之下把redhat9.0上的软件全都安上了
# make install

然后就可以使用qvfb体验miniGUI了:

# qvfb &
加上&符号使qvfb进程开启后shell立即返回,否则会阻塞shell进程,需要再开一个shell才可以运行minigui程序。
qvfb运行起来后在qvfb中设置虚拟显示器分辨率:File-->Configure,注意Size和Depth要设置的同MiniGUI.cfg
中的分辨率和色深一致。

qvfb设置搞定后就可以运行一个helloworld试试效果


1 关于QVFB

        Qvfb是为qtopia做的一个虚拟frambuffer的应用程序,它的最终目的就是把qtopia应用程序运行的的结果显示在qvfb上(实际中是要通过linux的frambuffer驱动显示在lcd屏上的),并提供键盘、鼠标的外设仿真。从而方便研发阶段,用户在pc端就可以完成qtopia的调试工作,极大的提高了工作效率。

 

2 QVFB概述

       Qvfb本身其实也是一个应用程序,qtopia也是一个应用程序,二者通过既定协议完成通信,如下图示。

更直观一点,如下图示。

Qpe和qvfb之间的通讯是基于既定的协议进行的,qpe和qvfb独立运行,它们处于不同的进程,它们之间以“共享内存”的方式完成通讯。

 

3 qpe端接口

       Qtopia中server 端启动时,会调用QVFbScreen::connect()函数来连接到屏幕,这里qpe会创建一块共享内存,模拟framebuffer,用于图象的输出,针对键盘鼠标分别创建两个文件,其名字由两个宏来决定,为QT_VFB_MOUSE_PIPE和QT_VFB_KEYBOARD_PIPE。

  • 关于图形绘制,qpe是通过QSCreen的派生类QVFbScreen来实现的,具体如下。

QSCreen定义了接口exposeRegion和blit,这两个函数会完成具体的绘制操作,不管是虚拟framebuffer还是真正的framebuffer,qtopia会将用于绘制的显示缓存映射到data变量,这样绘制操作就变成向data写数据了。

  • 关于鼠标

Qtopia通过QVFbMouseHandler来完成,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。

  • 关于键盘

Qtopia通过QVFbKeyboardHandler来实现,其构造函数中会打开约定的文件,键盘数据的获取就变成了文件的读取。

 

4 qvfb端介绍

       Qvfb实际上是一个用qt实现的完整的应用程序,其架构层次图如下图示。

      

分别作如下阐述

4.1层次划分

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

4.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();

            /* copy the memory area */

            /* for now, be inefficient. */

            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)来获取数据,最终绘制到窗口上。

 

4.3 键盘鼠标

  • 关于skin

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

  • 关于QVFbView

    会接受鼠标、键盘事件,由mousePressEvent、mouseReleaseEvent、keyPressEvent、 keyReleaseEvent。最终也是调用协议层QShMemViewProtocol中的QVFbMousePipe和 QVFbKeyPipeProtocol去发送鼠标、键盘事件,也就是写到既定的文件中,最终由qpe通过读取文件来获取鼠标、键盘事件。

 

5 关于qvfb的扩展

    扩展qvfb,使其能够支持audio和video,从而方便在pc端调试多媒体方面的模块,也可以脱离开发板,也提高开发效