一,输入:鼠标,键盘,触摸屏
1、-tslib和-evdev的区别
官方说明:Inputs on an Embedded Linux Device
configure 可以同时让Qt支持这2种功能,./configure –help的截取,可以看出默认是启动的,虽 但实际可能没有,具体以configure的输出为准
-no-evdev .......... Do not compile support for evdev. * -evdev ............. Compile support for evdev. -no-tslib .......... Do not compile support for tslib. * -tslib ............. Compile support for tslib //以下是启用这2个功能是的方法: -tslib -I /opt/tslib-1.14/include -L /opt/tslib-1.14/lib //tslib需要指定库文件 -evdev //直接启用 //以下是配置这2个功能启用/配置环境变量: # tslib eglfs 显示平台使用这个参数 export QT_QPA_EGLFS_TSLIB = 1 # tslib linuxfb 显示平台使用这个参数 export QT_QPA_FB_TSLIB = 1 # evdev的启用配置 export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event1:rotate=180:invertx and inverty
①tslib 单点输入,tslib 是一个第三方库,对电阻屏这类低精度屏而言表现较为优秀,用于输入设备:触摸屏;
②evdev 则是 Qt 自带输入库,支持多点输入,但是对于电阻这类需要校准的屏幕效果不好,适合电容这类屏幕,用于设备:鼠标,键盘,触摸屏(电容),支持环境变量触摸旋转倒置
编译Qt可以支持两种触摸方式,软件运行起来只能采用一种,具体用那种其实看看源码就知道了:
//文件位于qtbase/src/plugins/platforms/linuxfb/qlinuxfbintegration.cpp,qlinuxfbscreen.cpp也是在这里 void QLinuxFbIntegration::createInputHandlers() { #if !defined(QT_NO_EVDEV) && (!defined(Q_OS_ANDROID) || defined(Q_OS_ANDROID_NO_SDK)) new QEvdevKeyboardManager(QLatin1String("EvdevKeyboard"), QString(), this); new QEvdevMouseManager(QLatin1String("EvdevMouse"), QString(), this); #ifndef QT_NO_TSLIB //如果configure后qmake支持tslib const bool useTslib = qEnvironmentVariableIntValue("QT_QPA_FB_TSLIB");//如果用户用环境变量打开 tslib if (useTslib) new QTsLibMouseHandler(QLatin1String("TsLib"), QString()); else #endif // QT_NO_TSLIB new QEvdevTouchManager(QLatin1String("EvdevTouch"), QString() /* spec */, this); #endif }
从以上可以看出qt库文件支持tslib以及用环境变量打开tslib功能是tslib使用的充分条件,如果configure的时候发现tslib配置有问题就会禁用tslib功能
2、-tslib 的环境变量配置
export TSLIB_ROOT=/tslib export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/input/event1 export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts export TSLIB_CALIBFILE=/etc/pointercal export LD_PRELOAD=$TSLIB_ROOT/lib/libts.so export QT_QPA_FB_TSLIB=1 //Qt设置 export QT_ROOT=/qt5.5.1 export QT_QPA_GENERIC_PLUGINS=tslib:/dev/input/event1:edevmouse:/dev/input/event3 export QT_QPA_FONTDIR=/qt5.5.1/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_ROOT/plugins export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 export QT_PLUGIN_PATH=$QT_ROOT/plugins export LD_LIBRARY_PATH=$QT_ROOT/lib:$QT_ROOT/plugins/platforms
这写环境变量ts会使用,QT本身不使用这些变量,Qt使用的QT_QPA_FB_TSLIB=1 启用stlib触摸屏,否侧会使用evdev方式
3、注意点
①其实还有Lib:libinput,但是不怎么使用,libinput=evdev+tslib,启用方式:1.configure时使能libudev and libinput,2.disable the built-in input handlers:QT_QPA_FB_DISABLE_INPUT 3. ./App -plugin libinput
②evdev是直接调用,而libinput与tslib是库调用
③tslib其实是模拟鼠标,而不是真正的触摸处理,只能进行简单的单点触摸
④即使使用tslib,evdev还负责键盘和鼠标事务的处理,参考上面的createInputHandlers()函数,建立的处理句柄:EvdevKeyboardManager,QEvdevMouseManager,QEvdevTouchManager/QTsLibMouseHandler(tslib)
⑤tslib使能看QT_QPA_FB_TSLIB,如果没有使能就会使能evdev,需要看QT_QPA_EVDEV_MOUSE_PARAMETERS
, QT_QPA_EVDEV_KEYBOARD_PARAMETERS
and QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS
二,mkspecs
放qmake需要合适的mkspec文件夹生成Make file,在configure 命令种需要指定-xplatform其实就是指定mkspecs文件夹,mkspecs位于qtbase/mkspecs/下,里面有很多目标平台文件夹,嵌入式选择修改linux-arm-gnueabi-g++,此文件夹下通常有2个文件:qplatformdefs.h,qmake.conf,修改qmake.conf即可:
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard QMAKE_CXXFLAGS += -O2 -march=armv7-a -mtune=cortex-a7 -mfpu=neon -mfloat-abi=hard include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) # modifications to g++.conf QMAKE_CC = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-gcc QMAKE_CXX = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++ QMAKE_LINK = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++ QMAKE_LINK_SHLIB = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-g++ # modifications to linux.conf QMAKE_AR = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-ar cqs QMAKE_OBJCOPY = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-objcopy QMAKE_NM = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-nm -P QMAKE_STRIP = /opt/zlg_arm_linux/bin/arm-linux-gnueabihf-strip load(qt_config)
主要是设置了交叉编译器环境,执行Makefile时用给定的编译环境去编译Qt源文件,注意host平台用的一些可执行程序用的是g++编译器,qtbase/src/tools/下所有的源码都是编译成x86格式
ls -alh qtbase/src/tools/:
lee@MRZ:~/project/qt-everywhere-opensource-src-5.5.1$ ls -alh qtbase/src/tools/ 总用量 44K drwxrwxr-x 11 lee lee 4.0K 10月 9 2015 . drwxrwxr-x 22 lee lee 4.0K 9月 17 13:46 .. drwxrwxr-x 4 lee lee 4.0K 9月 17 13:47 bootstrap drwxrwxr-x 2 lee lee 4.0K 10月 13 2015 bootstrap-dbus drwxrwxr-x 5 lee lee 4.0K 9月 17 13:47 moc drwxrwxr-x 2 lee lee 4.0K 10月 13 2015 qdbuscpp2xml drwxrwxr-x 2 lee lee 4.0K 10月 13 2015 qdbusxml2cpp drwxrwxr-x 6 lee lee 4.0K 9月 17 13:47 qdoc drwxrwxr-x 6 lee lee 4.0K 9月 17 13:47 qlalr drwxrwxr-x 4 lee lee 4.0K 9月 17 13:47 rcc drwxrwxr-x 5 lee lee 4.0K 9月 17 13:47 uic
三,Qt Configure
官方文档
脚本
首先必须明白configure 都干了什么,congfiure 主要完成这件事情:
①是生成x86格式的qmake,这个qmake主要用来根据*.pro生成Makefile
②执行configure前需要检查系统的环境变量是否干净
③生成根目录下的Makefile:/qtbase/bin/qmake -o Makefile qt.pro
④检查configure选项是否支持,如果configure的时候使能tslib,但有没有指定tslib 头文件或者库文件目录,就会禁用tslib
最终需要检查configure后生成的统计文件,configure 常见选项:
-opensource -confirm-license -release -shared \\ -strip \\ //Strip binaries and libraries of unneeded symbols when installing -xplatform linux-arm-gnueabi-g++ \\ //目标mkspecs,这个是一个目录在qtbase/mkspecs/下有qmake,初始化编译环境 -optimized-qmake \\ -no-rpath \\ //不使用lib安装路径作为链接路径 -pch \\ //Use precompiled header support,通常大型项目有许多头文件,它们包含在每个源文件中。编译器一遍又一遍地处理这些头文件所花费的时间几乎占了构建项目所需的全部时间。为了使构建更快,GCC允许预编译头文件 #-skip 可以选择不编译某些Qt模块,其实就是是Qt*.so库.在根目录 tree -dL 1 ./ 可以看到文件夹目录,如果不想编译某些模块就加进去 #-skip qtbase \\ //Qt核心:QtANGLE QtConcurrent QtCore QtDBus QtGui QtNetwork QtOpenGL QtOpenGLExtensions QtPlatformHeaders QtPlatformSupport QtPrintSupport QtSql QtWidgets QtXml QtZlib -skip qt3d \\ //3D模块 :Qt3DCollision Qt3DCore Qt3DInput Qt3DLogic Qt3DQuick Qt3DQuickRenderer Qt3DRenderer -skip qtactiveqt \\ //ActiveQt -skip qtandroidextras \\ //安卓相关 :QtAndroidExtras -skip qtcanvas3d \\ //3D模块:QtCanvas3D -skip qtconnectivity \\ //蓝牙NFC:QtBluetooth QtNfc -skip qtdoc \\ -skip qtlocation \\ //位置定位:QtPositioning QtLocation -skip qtmacextras \\ //MAC系统:QtMacExtras #-skip qtmultimedia \\ //多媒体:QtMultimediaWidgets QtMultimediaQuick_p QtMultimedia -skip qtscript \\ //脚本:QtScriptTools QtScript #-skip qtquick1 \\ //QtDeclarative -skip qtsensors \\ //QtSensors -skip qtsvg \\ //QtSvg -skip qttools \\ //工具:QtCLucene QtDesigner QtDesignerComponents QtHelp QtUiPlugin QtUiTools -skip qttranslations \\ -skip qtwayland \\ //QtCompositor QtWaylandClient -skip qtwebchannel \\ //QtWebChannel -skip qtwebengine \\ //QtWebEngineWidgets QtWebEngine -skip qtwinextras \\ //windows:QtWinExtras #-skip qtwebkit \\ //QtWebKitWidgets QtWebKit -skip qtx11extras \\ //QtX11Extras -skip qtxmlpatterns \\ //QtXmlPatterns -make libs \\ //指定编译的部分,这个根skip区别是skip针对Qt模块,就是Qt*.so,make 是指定部分 -nomake tools -nomake tests -nomake examples \\ -gui \\ //编译QTGui.so -widgets \\ //编译QtWidgets -no-dbus \\ //进程间通信 -no-opengl \\ -linuxfb \\ -no-iconv \\ //编码转换 -no-glib \\ //glib库一般用不上 -qt-pcre \\ //Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用C语言编写的正则表达式函数 -qt-zlib \\ //压缩相关 -no-openssl \\ -qt-freetype \\ -qt-harfbuzz \\ -no-xcb \\ -qt-libpng \\ -qt-libjpeg \\ -qt-sql-sqlite \\ -no-tslib \\
四,打补丁
1、patch文件生成
diff 命令可以生成patch文件,具体使用方式:
diff -Naur old new >filname.patch
old与new 可以是具体文件也可以是文件夹
2、patch文件使用
可以加-d 指定qt源文件路径
patch -p0 <qt551LinuxfbRotate.patch
3、常用patch补丁
Qt5.5.1 支持旋转补丁
Qt5.4.1 支持旋转补丁
Qt5.12.9 支持旋转补丁