QT5的ARM移植及其中文显示.docx
《QT5的ARM移植及其中文显示.docx》由会员分享,可在线阅读,更多相关《QT5的ARM移植及其中文显示.docx(19页珍藏版)》请在冰豆网上搜索。
QT5的ARM移植及其中文显示
1.1QT5的移植
1.1.1Qwt6的配置
1.1.1.1Win7平台的qwt插件安装
qwt源码下载:
因为官方的qtcreator是用msvc编译的,不能识别mingw编译的qwt,所以需要将qtcreator的源码用mingw编译一次。
Qtcreator(msvc2013版)+vs2013+qwt的配置
编译qwt库
我用的qt5.4-msvc版本直接打开qwt的pro工程,编译全部,生成lib和dll文件
配置
(1)将qwtd.dll、qwt.dll拷贝到H:
\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\bin下,
将qwtd.lib、qwt.lib拷贝H:
\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\lib下(以qt安装目录H:
\Qt\Qt5.4.0\5.4\msvc2013_64_opengl为例)。
(2)将qwt_designer_plugin.dll和qwt_designer_plugin.lib拷贝到H:
\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\plugins\designer目录下。
(3)将qwt\src目录下的所有.h和.cpp放入一个空文件夹QWT中,再将该文件夹拷贝到H:
\Qt\Qt5.4.0\5.4\msvc2013_64_opengl\include目录下。
使用
新建项目,然后进行配置:
(1)属性->配置属性->C/C++->常规,附加包含目录:
$(QTDIR)\include\QWT
(2)属性->配置属性->链接器->输入,附加依赖项:
qwtd.lib
(3)属性->配置属性->C/C++->预处理器,预处理器定义:
QWT_DLL
1.1.1.2Ubuntu平台的qwt插件安装
GCC的qmake
建立gcc版本的qmake软链接
将gcc-qmake放到/usr/bin下面就可以使用gcc-qmake了。
为了和ARM版本的qmake区别!
删除链接
那么我就可以在ubuntu下面编译qwt了。
因为我用qt-creator打开qwt.pro后,builder后不知道在哪里生成了哪些东西。
进入qwt-6.1.2目录
只好用qmake手动编译了。
#gcc-qmake
#make
#makeinstall
就会在/usr/local下面生成
安装qwt插件到ubuntu的qt-creatro中去
一定要注意下面的这个路径:
Qt5.5.0/Tools/QtCreator
折腾了半天,就是掉了这个路径
还有另外的一个路径:
下面的暂时不要这么做,因为不晓得在qt-creator如何应用头文件,还是先直接引用
/usr/local/qwt-6.1.2/lib+include吧
另外拷贝/usr/local/qwt-6.1.2/lib下面的4个库到相应的目录
新建1个Qwt的目录,拷贝头文件到里面
Qwt的交叉编译
我的qt库交叉版本没有使能opengl选项,所以qmake,make出现错误!
找不到opengl模块
配置qwt,重要的配置文件qwtconfig.pri
修改qwtconfig.pri,里面可以设置install的路径,去除
需要注释如下的编译选项,编译armqt时,没有支持opengl。
#QWT_CONFIG +=QwtOpenGL
第二,需要注释如下的编译选项:
#QWT_CONFIG +=QwtDesigner
同时修改安装路径为:
避免和gcc版本的混淆
当然需要安装到开发板上面,才能运行。
1.1.1.3Qwt的使用
INCLUDEPATH+=/usr/local/qwt-6.1.2/include
LIBS+=-L"/usr/local/qwt-6.1.2/lib/"–lqwt
看下面:
在QtCreator的tool菜单中选择FormEditor-》AboutQtDesignerplugins查看是否安装了libqwt_designer_plugin.so
1.1.2Qt5.5的ubuntu12.04安装
#apt-getinstalllibssl0.9.8
1.1.2.1ibus安装步骤
第一步:
安装语言包
进入“SystemSettings”,找到“LanguageSupport”那一项,点击进入
选择“Install/RemoveLanguages”,找到“Chinese(simplified)”那一项,把后面到勾打上
然后点击“ApplyChanges”
等待一段时间即可
第二步:
安装Ibus框架
调出terminal终端,输入命令:
sudoapt-getinstallibusibus-clutteribus-gtkibus-gtk3ibus-qt4
启动Ibus框架,在终端下输入命令:
im-switch-sibus
PS:
安装完Ibus框架之后,记得重启或者注销系统,要保证更改生效才行哦
第三步:
安装拼音引擎
有很多拼音引擎可供选择,一般安装一种就够了,比如我就直接安装的第一种
Ibus拼音:
sudoapt-getinstallibus-pinyin
Ibus五笔:
sudoapt-getinstallibus-table-wubi
Google拼音:
sudoapt-getinstallibus-googlepinyin
Sun拼音:
sudoapt-getinstallibus-sunpinyin
第四步:
设置Ibus框架
在 terminal中输入命令:
ibus-setup
执行之后,会自动调出一个IbusPreference设置框,选择上面的“InputMethod”
选择相应的中文输入方式,然后点击“Add”
注意:
最好是安装什么输入法就Add什么输入法
这里还可以设置调出相应输入法到快捷键,默认的是 “Ctrl+Space”
好了,中文输入法已经安装完毕
最后推荐一个非常好用到截图工具:
KSnapshot
他能让人非常随意的截图,还能设置延迟时间,用了才知道他到底有多方便
安装方法:
调出terminal输入:
sudoapt-getinstallksnapshot 并执行,等待一段时间后便可
1.1.2.2中文输入法配置
#locale–a
查看是否有:
zh_CN.utf8
/etc/profile环境变量的设置,注意是ibus
系统的ibus设置位置
需要支持utf-8中文环境[没有试过]
设置中文环境很简单,需要三步。
第一步,安装中文包:
sudoapt-getinstalllanguage-pack-zhlanguage-pack-zh-base
第二步,配置相关环境变量:
sudovim/etc/environment
在文件中增加语言和编码的设置:
LANG=”zh_CN.UTF-8″
LANGUAGE=”zh_CN:
zh:
en_US:
en”
第三步,重新设置本地配置:
sudodpkg-reconfigurelocales
1.1.2.3UI界面不更新问题
Ubuntu12的gnome主题安装
#apt-getinstallgnome-shell,本用它解决qt-creator的ui不更新问题,结果没有作用。
解决linux下的ui界面不更新的方法:
项目设置文件.pro内增加UI_DIR=./UI,同时删除掉源代码目录中ui_*.h,clearall,->qmake->rebuiltall
总结:
导致ui_*.h文件没有更新的原因是源代码中#includeui_*.h的位置和实际生成的位置不同,引用的是老的ui_*.h,设置UI_DIR后就规定了位置于是不会出错了。
确实如此:
操作一次后,以后就立即生效了。
新建工程的时候,会生成一个单独的build-test***目录
是没有UI目录的,通过修改.pro,指定UI的头文件路径,它以后就老老实实的呆在那里了!
而之前的错误是:
Build-xxx目录下面有ui_xxx.h文件,test_my源目录下面也有ui_xxx.h文件。
导致修改ui后的ui_xxx.h文件无法引用到工程中!
所以一直导致ui不变化!
源码目录:
Build-xxx目录:
2者不同步!
通过强行制定UI_DIR来解决!
1.1.3Qt5.5的交叉编译
1.1.3.1ARM平台交叉编译
Qt的版本:
qt5.5,交叉工具链版本:
总结:
1解压源码,配置交叉工具链
编译的东西在qtbase目录下,在mkspecs下面复制linux-arm-gnueabi-g++全部为
Linux-arm-qt5-notslib
2修改qmake.conf
-mthumb-march=armv7-a
Qt5的配置和Qt4的有太多的不一样。
③配置选项
./configure-prefix/opt/qt-5.3.2-arm-xplatformLinux-arm-qt5.3.1-notslib-release-confirm-license-opensource-no-openssl-no-qml-debug-qt-zlib-qt-libpng-qt-libjpeg-qt-freetype-qt-harfbuzz-qt-pcre-no-xcb-qt-xkbcommon-no-opengl-no-pch-verbose-no-kms-no-eglfs-no-icu-no-icu-no-iconv-skipqtwebkit-no-gcc-sysroot-no-largefile-no-nis-nomaketools-no-compile-examples-no-c++11-no-cups
这里../qt55-notslib换成绝对路径,不然它会在当前目录下生成qt55-notslib目录
或者改成./_install目录
注意:
./configure命令运行完成后,它会提示“make”,”makeinstall”命令,但是在它之前会打印很多Error,说什么找不到头文件,找不到sql等等。
不管他,那些头文件,解压源码后根本没有!
在这里浪费了很多的时间。
1编译
make
makeinstall就会在-prefix指定的目录下生成
2虚拟机上设置qmake–arm的环境
这样就可以交叉编译qt工程了。
拷贝qt-arm库到开发板的rootfs文件系统,主要是这3个文件
设置开发板的qt环境变量
将它写成脚本,#../qt-board.sh在开机启动的时候加入,就可以了!
注意鼠标,键盘的变量和对应的设备节点
内核默认是打开HID设备驱动的,如果找不到输入设备,看内核是否打开usb的HID支持!
如何确定设备节点?
插入无线鼠标、键盘到usb口,console检测到后,会打印信息出来。
这个时候就可以看到。
确定是哪个?
一般会出现2个,有1个是正确的。
#cat/dev/input/event1移动鼠标/按下键盘,有反应,打印乱码的就是它了!
和Qt4不同的是,Qt5对键盘的设置是环境变量指定就行了,而Qt4还要在./configure中加入键盘,鼠标的选项来支持!
问题又来了:
默认Qt5的显示是看不到鼠标的?
暂时打开:
嵌入式linux的相关设置
http:
//doc.qt.io/qt-5/embedded-linux.html#configuring-for-a-specific-device
QT_QPA_PLATFORM=linuxfb:
fb=/dev/fb1 specifiesthattheframebufferdevice /dev/fb1
size=x -
ParameterslikethedevicenodenamecanbesetintheenvironmentvariablesQT_QPA_EVDEV_MOUSE_PARAMETERS, QT_QPA_EVDEV_KEYBOARD_PARAMETERS andQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS.
Additionally,thebuilt-ininputhandlerscanbedisabledbysetting QT_QPA_EGLFS_DISABLE_INPUT or QT_QPA_FB_DISABLE_INPUT to 1
屏幕旋转
Onsometouchscreensthecoordinateswillneedtoberotated.ThiscanbeenabledbysettingQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS to rotate=180.
QT_QPA_FB_HIDECURSOR (forlinuxfb) 关闭鼠标
exportQT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS="rotate=180"
exportQT_QPA_PLATFORM=linuxfb:
fb=/dev/fb0,size=480x272
1.1.3.2x86平台的交叉编译
#输入qvfb,提示要安装包
#apt-getinsall就可以了。
1.1.3.3qt的中文输入法
1.1.3.4字体转换工具
Qt5.5的源码就包含这个工具
Qtcomeswiththecross-platform makeqpf tool,includedinthe tools directory,whichallowsgenerationofQPF2filesfromsystemfonts.
在Linux中分别安装应用于不同平台的Qt:
PC;嵌入式X86;ARM。
这三者PC版、嵌入式X86版和ARM版的区别主要体现在:
当configure时分别加了不同的参数,具体区别是:
PC平台(X11平台):
在linux中全安装qt,用它编译好程序后,直接用“./”就可运行。
嵌入式X86平台:
带有qvfb功能,在PC机上可以模拟应用程序在arm开发板上的运行情况。
用此编译好的程序,只用“./”命令不可以运行,必须加上参数[-qvfb]–qws
Ps:
嵌入式X86平台,这个是PC下的一个qtopia,他自带有个模拟器,可以模拟出arm开发板的样子出来。
方便调试;
ARM平台:
编译好的程序,用于在arm平台上运行。
Ps:
ARM平台,这个主要是用来编译,因为要下载到开发板上,需要arm版的qte的库文件,编译后直接下载到开发板运行;
Ps:
编译x86是为了得到makeqpf,编译pc是为了得到qvfb
我是如何编译makeqpf的
Qvfb好编译,直接在#输入qvfb,提示缺失什么,就#apt-getinstall就行了。
问题是怎么编译embedded–x86版本的?
它对应的编译器是什么?
网上找不到,都是qt4的。
没有办法,试试。
解压qt5.5-everywhere-xxx的源码,改为qt-5.5-src-x86,qt5-x86为编译后的安装目录
配置qt5.5
注意:
一点要有-qt-xcb插件,不然makeqpf无法运行的。
我编译了2个小时,没有xcb插件!
怎么搞?
从来?
单独的编译xcb插件,如果忘记了配置,直接进入它的目录,#make,#makeinstall就行了。
这里就是xcb插件的目录,在它下面qmake,make,makeinstall
这里的gcc-qmake就是我再ubuntu下面安装的qt5.5-creator后的qmake,gcc-qmake是他的软连接
设置好/etc/profile的qt-x86的LD库和插件的路径
把所有用到的汉字写到一个文本文件里,在makeqpf(Qt4)里选择这个文件,生成的字体文件就很小。
准备要转换的字体文件,可在C:
\WINDOWS\Fonts 下找,或者去下载。
这里我们是下载的wqy-zenhei.ttf。
将wqy-zenhei.ttf字体文件拷贝到/usr/local/Trolltech/qt-4.7.0-x86/lib/fonts中,这样是为了在makeqpf中找到它
旋转字体库的制作
使用带参数的方式执行makeqpf,如
./makeqpf -display Transformed:
Rot90
以上指令用于制作翻转90度的字库文件,制作其它的字库文件只需将270改为90,180,0等
注:
在$(QTDIR)/lib/fonts/目录下的qpf字体文件中,文件名中带有t5,t10,t15等后缀的为旋转字体库,t5为旋转90度,t10为旋转180度,t15为旋转270度。
如wenquanyi_160_50_t5.qpf
1.1.3.5Qt的中文ARM显示
Qtnormallyuses fontconfig toprovideaccesstosystemfonts.If fontconfig isnotavailable,e.g.indedicatedembeddedsystemswherespaceisatapremium,QtwillfallbacktousingQBasicFontDatabase.Inthiscase,QtapplicationswilllookforfontsinQt's lib/fonts/ directory.QtwillautomaticallydetectprerenderedfontsandTrueTypefonts.
Qt的配置相关:
-no-fontconfig.....DonotcompileFontConfigsupport.
+-fontconfig........CompileFontConfigsupport.
嵌入式里面如果没有配置fontconfig,那么它就会在lib/fonts目录下面找字体,默认不配置。
已经摸索出解决方案【验证不成功,返回-1】
#include
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
int nIndex = QFontDatabase:
:
addApplicationFont("./Resources/msyh.ttf");
//这里我加载返回-1,加载qpf2的字体不成功
if (nIndex !
= -1)
{
QStringList strList(QFontDatabase:
:
applicationFontFamilies(nIndex));
if (strList.count() > 0)
{
QFont fontThis(strList.at(0));
fontThis.setPointSize(9);
a.setFont(fontThis);
}
}
....................
}
我的验证正确的过程:
这样是可以显示中文的
最后测试:
不需要
//QTextCodec:
:
setCodecForLocale(QTextCodec:
:
codecForName("UTF-8"));
也可以,ui->lineEdit->setText(QString:
:
fromLocal8Bit("我爱你我的祖国"));显示乱码
ui->lineEdit->setText(QObject:
:
trUtf8("我爱你我的龚晗玥"));//显示正常
我用的字库
为什么下载的wenquanyi字体和我自己用makeqpf制作的qpf2字体无法识别?
Wqy-zenhei.ttc是从ubuntu12里面拷贝出来的。
它就能识别
Ubuntu下面的字体路径
测试我的程序:
输出它能找到的字体
注意设置font的名字要和这里的打印的全称一致!
进一步的测试:
直接将win7下面的ttf中文字体拷贝到arm板子的fonts下面就能识别,如上图:
“LiSu”,“STLite”
Qt5是有bug的,不识别Qpf字体,害我折腾了好几天!
AccordingtothedocumentationQPFisonlysupportedwhenusingthebasicfontdatabase,bydefaultlinuxwouldusethefontconfigfontdatabase.