目录
目录
3. Qt程序移植到Linux(Buildroot文件系统)上后的环境变量配置(Tslib)
4. Qt程序移植到Linux上后的环境变量配置(不用Tslib)
1. Qt退出应用程序
严格来讲,this->close() 只能让widget退出。要让应用完全退出可以采取以下办法:
QApplication* app;
app->quit();
// or app->exit(0);
QApplication::instance()->quit();
qApp->quit();
qApp是一个宏,指向的就是 static_cast<QApplication *>(QCoreApplication::instance()) 。详情请查看Qt源码。
2. Qt源码编译的各种设置
我们下载 qt-everywhere-src-5.15.2.tar.xz 解压并进入根目录。
其实只要运行:
./configure xxx
make
make install
就可以生成编译好的Qt包了,其中包含qmake,各种.so动态库 等等。
举例讲,一个设置的脚本:
#!/bin/sh
./configure -prefix $(pwd)/arm_qt \
-opensource \
-confirm-license \
-release \
-strip \
-shared \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-c++std c++11 \
--rpath=no \
-pch \
-skip qtdoc \
-skip qtpurchasing \
-skip qtlocation \
-make libs \
-make examples \
-nomake tools -nomake tests \
-gui \
-widgets \
-dbus-runtime \
--glib=no \
--iconv=no \
--pcre=qt \
--zlib=qt \
-no-openssl \
--freetype=qt \
--harfbuzz=qt \
-no-opengl \
-linuxfb \
--xcb=no \
-evdev \
-no-feature-tslib \
--libpng=qt \
--libjpeg=qt \
--sqlite=qt \
-plugin-sql-sqlite \
-recheck-all
比较重要的几个设置选项:
- -prefix 编译好生成的输出路径
- -xplatform 选用哪个qt-mkspecs的qmake.conf。具体位置在 qt-everywhere-src-5.15.2 /qtbase/mkspecs/ 目录下
- -c++std 选用哪个C++版本来编译
- -skip 不选择哪个Qt的模块
- -no-feature-xxx 不选择哪个第三方模块库
由此,我们就可以配置我们要输出的Qt模组包含哪些功能。
3. Qt程序移植到Linux(Buildroot文件系统)上后的环境变量配置(Tslib)
环境变量对操作系统来说,好比房间钥匙,不然打不开房门,用不了可执行文件,动态库,头文件。。。比如说在windows上装好了JDK,肯定要在“系统环境变量”里加上JDK的bin路径,不然eclipse都打不开。
同理,要想在ARM板子上运行Qt触摸屏程序,必须在板子上的Linux里声明许多必要的全局变量:
不妨全写在一个 qt-imx6ull.sh 文件里,在从/etc/profile里调用(source *.sh)
#!/bin/sh
export TSLIB_CONSOLEDEVICE=none #终端控制台不需要
export TSLIB_FBDEVICE=/dev/fb0 #根据LCD屏幕对应的设备节点设置
export TSLIB_TSDEVICE=/dev/input/event1 #根据实际情况更改,接入触摸屏后,生成的event设备节点
export TSLIB_CONFFILE=/etc/ts.conf #tslib的配置文件,一般情况下不需要更改
export TSLIB_PLUGINDIR=/usr/lib/ts #插件的目录,存放着input.so
export TSLIB_CALIBFILE=/etc/pointercal #校准后生成的校验文件
export LD_LIBRARY_PATH=/lib:/usr/lib #添加共享库的目录
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export QWS_MOUSE_PROTO=tslib:/dev/input/event1 #QT输入设备的环境变量
export QT_QPA_PLATFORM_PLUGING_PATH=/usr/lib/qt/plugins # platforms/*.so 各个platform动
# 态库的保存位置
export QT_QPA_PLATFORM=linuxfb:tty=/dev/fb0 #Qt用哪个platform运行,这个在buildroot配置页面
#里有提示,这里使用linuxfb
export QT_QPA_GENERIC_PLUGINS=tslib:$TSLIB_TSDEVICE # Qt使用的插件类型
export QT_QPA_FONTDIR=/usr/share/fonts/cantarell #Qt调用的字体库,在buildroot配置页面要勾选才能生成
export QT_QPA_FB_TSLIB=1 # 很重要!使能Qt(linuxfb平台)调用tslib控件
首先是TSLIB系统,它们声明的是tslib触屏控件的一些路径和对象。路径的设置必须根据实际情况,打开buildroot生成的文件系统,重点看看/usr/lib, /dev下面,有没有想要的东西。配置好以后,直接运行 ts_calibrate 或者 ts_test ,看看能不能运行即可。
而后是QT_QPA系列环境变量,它们直接决定qt程序能不能在目标平台上正常启动。打开buildroot生成的文件系统,重点看看/usr/lib, /usr/share下面,有没有想要的东西。这里的QT_QPA_FB_TSLIB不声明的话,触摸屏点击qt程序没反应。是联系tslib和Qt的桥梁。
总之,可以通过输入env,看看有没有正确设置该有的全局变量。
参考:tslib库移植错误解决_努力的码农的博客-CSDN博客
IMX6学习记录(28)-使用Buildroot构建QT_Jun626的博客-CSDN博客_buildroot qt
Couldnt load module input, no modules loaded_deshang7096的博客-CSDN博客
4. Qt程序移植到Linux上后的环境变量配置(不用Tslib)
参考:20200620-01 Qt5.14.2 交叉编译触摸输入 Tslib1.14 / evdev 等方式详细说明_迪加不会飞的博客-CSDN博客
其实把Qt程序移植到电容屏的板子上,就不一定需要Tslib了,因为不需要校准。
对于 Qt 而言,它支持 tslib 单点输入,tslib 是一个第三方库,对电阻屏这类低精度屏而言表现较为优秀;而 evdev 则是 Qt 自带输入库,支持多点输入,但是对于电阻这类需要校准的屏幕效果不好,适合电容这类屏幕。
我们在编译qt源码时,可以加入这样的设置:
./configure -evdev
不过evdev 一般都是默认添加到编译之中的。
qt-imx6ull.sh 文件可以这样:
#!/bin/sh
# No tslib
export QT_LOGGING_RULES=qt.qpa.input=false
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0
export QT_QPA_EVDEV_MOUSE_PARAMETERS=/dev/input/event0
export QT_QPA_FB_HIDECURSOR=1 #隐藏鼠标光标
export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0 # 输入插件 evdevtouch
export QT_ROOT=/usr/local/lib/pilot_qt
export QT_QPA_FONTDIR=/usr/share/fonts/cantarell
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:/usr/lib:$LD_LIBRARY_PATH