我教你konqueror的移植

运维 系统运维
Konqueror 是 KDE 桌面系统的一部分,主要用于 Linux 和 BSD家族的操作系统。在微软的 Windows 系统下,也有零星使用,当然功能相对有限。Konqueror主要用于文件管理、浏览,以及网页浏览。Konqueror 按照 GPL 进行发布。本文我给大家带来的是konqueror的移植的过程。

Konqueror很多人用,反正比某些浏览器强多了,本文教给大家konqueror的移植的方法。

  1、编译QTE库

  一般,如果你要做Qt/Embedded的开发,***把Qt/Embedded编译成为两个版本,一个是主机版,一个是目标版。

  2、在获得Qt/ Embeded 的源码之后,将其分别解压到两个目录

  3、编译主机版本

  1) export环境变量

  export QTDIR=/usr/local/qtopia/work/qt-2.3.5

  export QTEDIR=$QTDIR

  export PATH=$QTDIR/bin:$PATH

  export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

  2) 运行./configure

  ./configure -depths 4,8,16.32 -no-ipv6 -no-cups -no-pch -qvfb

  3) 编译Qt/Embedded函数库

  make sub-src

  4) 编译Qt/Embedded辅助开发工具

  cd tools;make

  这一步就会成一个可以在主机环境(x86)下运行的uic指令,放在$QTDIR/bin目录中。

  这时可以使用qte提供的qvfb工具 可以在qvfb窗口中运行examples 中的例子

  四. 编译目标版本

  首先安装交叉编译工具

  qte 版本是qt-2.3.5

  由于我使用的是PXA255的板子 它所带的触摸屏驱动与qt-embedded 中的触摸屏接口不符

  必须修改qte目录下src/kernel/qwsmouse_qws.cpp

  在定义QCustomTPanelHandlerPrivate类时 增加一个成员变量unsigned char prevstate

  以下为修改后的类定义

  class QCustomTPanelHandlerPrivate : public QWSMouseHandler {

  Q_OBJECT

  public:

  QCustomTPanelHandlerPrivate(MouseProtocol, QString dev);

  ~QCustomTPanelHandlerPrivate();

  private:

  int mouseFD;

  unsigned char prevstate;

  private slots:

  void readMouseData();

  };

  然后修改成员函数readMouseData

  修改为:

  void QCustomTPanelHandlerPrivate::readMouseData()

  {

  if(!qt_screen)

  return;

  CustomTPdata data;

  short data2[4]={0};

  int ret;

  ret=read(mouseFD,data2,sizeof(data2));

  if(ret) {

  data.status=data2[0];

  data.xpos=data2[1];

  data.ypos=data2[2];

  QPoint q;

  q.setX(data.xpos);

  q.setY(data.ypos);

  mousePos=q;

  if(data.status && !prevstate) {

  emit mouseChanged(mousePos,Qt::LeftButton);

  } else if(!data.status&&prevstate){

  emit mouseChanged(mousePos,0);

  }

  prevstate=data.status;

  }

  if(ret<0) {

  qDebug("Error %s",strerror(errno));

  }

  }

  然后编译qte

  编译脚本如下 :

  #!/bin/sh

  export QTDIR=`pwd`

  export CC=arm-linux-gcc

  export AR=arm-linux-ar

  export NM=arm-linux-nm

  export RANLIB=arm-linux-ranlib

  export CXX=arm-linux-g++

  export LINKER=arm-linux-g++

  export STIRP=arm-linux-strip

  export OPTIONS="-DQT_QWS_IPAQ -DQWS -dno-exceptions -fno-rtti -pipe"

  make clean

  echo yes | ./configure -release -shared -gif -no-sm -no-thread -system-zlib -system-libpng -no-mng -system-jpeg -no-nas-sound -no-opengl -no-xft -qconfig qpe -depths 16 -no-qvfb -vnc -xplatform linux-ipaq-g++ &&

  make

#p#

  五 编译qtopia目标平台版本

  与qte2.3.5对应的 qtopia版本是qtopia 1.6.*

  我选择的是 qtopia-commercial-1.6.1

  编译脚本如下

  #!/bin/sh

  unset TMAKEPATH

  export QTDIR=`pwd`/../../qt-2.3.5

  export QTEDIR=$QTDIR

  export QPEDIR=`pwd`/../

  export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH

  export CC=arm-linux-gcc

  export AR=arm-linux-ar

  export NM=arm-linux-nm

  export RANLIB=arm-linux-ranlib

  export CXX=arm-linux-g++

  export LINKER=arm-linux-g++

  export STIRP=arm-linux-strip

  export LD=arm-linux-ld

  make clean

  ./configure -release -shared -platform linux-ipaq-g++ &&

  make

  六 编译konqueror

  在konqueror homepage下有很多konqueror-embedded-snapshot的包下载

  http://developer.kde.org/~hausmann/snapshots/Attic/

  我下载的是konqueror-embedded-snapshot-20030705.tar.gz 解压缩

  为了支持中文网页 konqueror 的字体必须设置为unifont 而不是默认的helvetica

  在dropin目录下修改kglobalsettings.cpp

  将KGlobalSettings类 generalFont成员函数找到初始化QFont对象

  s_generalFont = new QFont( "helvetica", 12 );

  其中的helvetica改为unifont

  我的交叉编译脚本:

  export QTDIR=/usr/local/Qt/qt-2.3.5

  export QTEDIR=$QTDIR

  export QPEDIR=/usr/local/Qt/ qtopia-commercial-1.6.1

  export PATH=$QTDIR/bin:$QPEDIR/bin:$PATH

  export LD_LIBRARY_PATH=$QTDIR/lib:$QPEDIR/lib:$LD_LIBRARY_PATH

  export AR=arm-linux-ar

  export AS=arm-linux-as

  export LD=arm-linux-ld

  export RANLIB=arm-linux-ranlib

  export CC=arm-linux-gcc

  export CXX=arm-linux-g++

  export NM=arm-linux-nm

  ./configure --disable-debug --libdir=$QPEDIR/lib --host=arm-linux --prefix=$QPEDIR/image/opt/Qtopia --enable-qt-embedded --enable-embedded --enable-qtopia --enable-qpe --enable-readwrite --enable-cgi --enable-sidebar --enable-fontsubs --disable-jshostext --enable-largeicons --with-qt-dir=$QTDIR --with-qt-libraries=$QTDIR/lib --with-qtopia-dir=$QPEDIR --with-gui=qpe --with-qt-includes=$QTDIR/include

  make

  make install

  这时在konqueror 的文件夹中 konq-embed/src下 可以找到konqueor可执行文件 konqueror.desktop

  和konqueror.png

  把可执行文件拷贝到$QPEDIR/bin下 把konqueror .desktop拷贝到$QPEDIR/apps/Application下

  把konqueror.png 拷贝到$QPEDIR/pic下

  备注:在拷贝konqueror.desktop之前 ,在PC机上选择该文件,右键选择快捷菜单中的属性,在弹出的窗口中选择启动器标签 ,在命令一栏konqueror的后面添上-font unifont 以显示中文网页

  在PC机的 /usr/local下有一个kde文件夹 将这个文件夹拷贝到嵌入式文件系统下的某个目录 (我拷贝在嵌入式文件系统的 /usr/local下 )

  这个文件夹下的子目录下的 html4.css和 charsets二个 文件是运行konqueror必须的

  六 移植并执行

  在PC机编译好的qtopia目录下有一个createdesktop脚本 运行这个脚本 生成一个.tar文件 可以将这个文件拷贝到嵌入式文件系统下的某个目录 同时还要将交叉编译的qt-2.3.5中的lib目录下的库文件和font文件爱你夹拷贝加入到qtopia的lib目录下

  我将tar包解压缩后拷贝在/usr/person下(当然也可以拷贝tar包,运行qpe时再将tar包解压缩)

  为了使qt能找到触摸屏驱动 需建立链接 在rootfs中的/etc/init.d/rcS中加入

  ln -s /dev/misc/touchscreen/ucb1x00 /dev/ts

  ln -s /dev/misc/touchscreen/ucb1x00 /dev/h3600_ts

  ln -s /dev/misc/touchscreen/ucb1x00 /dev/tpanel

  ln -s /dev/misc/touchscreen/ucb1x00 /dev/touchpanel

  为了使konqueror能访问Internet 需要设置网关 在rootfs中的/etc/init.d/rcS中加入

  route add default gw 192.168.2.1 (192.168.2.1是网关IP)

  ***运行qtopia需要校正 用户在触摸屏上指定4个角和中心点的位置

  这时qpe会向/tmp/poitercal这个文件里写数据 而原先这个文件是空的

  文件内容为:73763 0 -1058203 0 76106 -1382584 65536

  可以在init.d/rcS中加入相关命令 省去每次加电运行qpe 均需校正的麻烦

  /home/zhangyu/rootfs/usr/person/qtopia-commercial-1.6.1

  在PXA255上运行qtopia的脚本:

  export HOME=/usr/person/qtopia-commercial-1.6.1

  export QTDIR=/usr/person/qtopia-commercial-1.6.1

  export QPEDIR=/usr/person/qtopia-commercial-1.6.1

  export QWS_MOUSE_PROTO=TPanel:/dev/h3600_ts

  export LD_LIBRARY_PATH=/usr/person/qtopia-commercial-1.6.1/lib:$LD_LIBRARY_PATH:/usr/local/qt-2.3.5/lib

  export KDEDIR=/usr/local/kde

  /usr/person/qtopia-commercial-1.6.1/bin/qpe -qws -font unifont &

  一定要指明kde路径 否则运行konqueror时提示找不到html4.css和 charsets二个 文件

  这时候就可以看见qtopia 的启动画面 如果在选择语言为中文或韩文后发现标题和图标文字为方块 可以在settting下进行appearence和launch拉中选择字体文unifont

  在应用程序中有个web browser的图标 点击就打开浏览器

  备注:颜色显示问题 由于我烧写的内核framebuffer中对16位深度的像素,RGB颜色分配位数均为5位

  可参考内核dirve/video/pxafb.c

  if (var->bits_per_pixel == 16) {

  var->red.offset = 10; var->red.length = 5;

  var->green.offset = 5; var->green.length = 5;

  var->blue.offset = 0; var->blue.length = 5;

  }

  而qt-embedded在将RGB颜色转换为16位深度时 定义的RGB分别占用5位 6位 5位 若不改动会造成色彩失真 在图像边缘处尤其明显

  转换的函数在src/kernel/qcolor_qws.cpp中被调用

  case 16: {

  return pix = qt_convRgbTo16(rgbVal);

  #endif

  } case 24:

  该函数和占位格式的定义在qgfx_qws.h中

  # define QT_QWS_DEPTH16_RGB 565 改为# define QT_QWS_DEPTH16_RGB 555

  随后的

  static const int qt_rbits = (QT_QWS_DEPTH16_RGB/100);

  static const int qt_gbits = (QT_QWS_DEPTH16_RGB/10%10);

  static const int qt_bbits = (QT_QWS_DEPTH16_RGB%10);

  static const int qt_red_shift = qt_bbits+qt_gbits-(8-qt_rbits);

  static const int qt_green_shift = qt_bbits-(8-qt_gbits);

  static const int qt_neg_blue_shift = 8-qt_bbits;

  RGB的占位和偏移量均由QT_QWS_DEPTH16_RGB 常量决定

  修改后 颜色显示正常

怎么样?通过阅读文章,觉得做开发一个Konqueror还是有点难度的,赶快学习吧!

【编辑推荐】

  1. Konqueror简单介绍
  2. 嵌入式浏览器Konqueror的技术分析
  3. 我教你修改konqueror工具栏
  4. 让我的konqueror显示中文网页
  5. Konqueror 特殊超能力
  6. 图文并茂 Konqueror让你一看就精通
  7. 深入了解 Konqueror/embedded的编译和安装的过程
  8. Opera快速拨号引入Konqueror方法
  9. Konqueror右键菜单的扩展
责任编辑:赵鹏 来源: 网络转载
相关推荐

2011-02-22 17:29:24

konqueror

2011-02-22 17:40:54

konqueror

2011-02-24 10:27:06

Konqueror使用

2011-02-23 09:29:29

Konqueror

2011-02-24 11:16:23

Konqueror

2011-02-24 11:22:12

Konqueror

2011-02-24 11:10:33

Konqueror

2011-02-22 16:38:03

Konqueror

2011-02-22 17:48:34

Konqueror

2011-03-04 12:18:24

FileZilla

2011-02-23 09:07:33

Konqueror

2011-02-23 10:35:04

Konqueror

2022-07-26 12:03:29

嵌入式系统开源

2011-02-22 17:12:40

2011-02-23 12:49:31

KonquerorEmbedded

2011-02-23 10:23:40

Konqueror

2011-02-21 17:32:37

Vsftpd

2024-05-16 10:59:16

Vue项目前端

2024-03-06 11:14:13

ViteReact微前端

2011-02-22 18:09:08

Konqueror
点赞
收藏

51CTO技术栈公众号