我添加了函数后点击触摸屏,无论是单点还是多点都无法接收到事件,设备支持触摸屏并关联了tslib,tslib的test中可以进行多点触摸,但界面我接收不到触摸事件,函数如下图添加,这是怎么一回事?
因为Qt5.9.8支持C++11,所以编译器版本需要高于4.8以上,Xilinx Petalinux2015.2.1的GCC版本为4.9,支持,这里可以看到Qt对arm和arm64的支持,但是已经不支持powpc平台,所以T2080需要自己写mkspecs了,QorIQ-SDK-V2.0-20160527-yocto工具链的gcc版本4.9,理论上支持Qt5.9.8,arm的qmake.conf针对工具链修改,aarch64的默认的就是对的,
zc@ubuntu:~/fdk_develop/package/qt-everywhere-opensource-src-5.9.8$ ls -l qtbase/mkspecs/
total 252
...
drwxrwxr-x 2 zc zc 4096 Apr 9 04:52 linux-aarch64-gnu-g++
drwxrwxr-x 2 zc zc 4096 Apr 9 04:52 linux-arm-gnueabi-g++
...
zc@ubuntu:~/fdk_develop/package/qt-everywhere-opensource-src-5.9.8$ ls -l qtbase/mkspecs/linux-arm-gnueabi-g++/
total 8
-rw-rw-r-- 1 zc zc 766 Apr 9 04:52 qmake.conf
-rw-rw-r-- 1 zc zc 1998 Apr 9 04:52 qplatformdefs.h
zc@ubuntu:~/fdk_develop/package/qt-everywhere-opensource-src-5.9.8$ ls -l qtbase/mkspecs/linux-aarch64-gnu-g++/
total 8
-rw-rw-r-- 1 zc zc 766 Apr 9 04:52 qmake.conf
-rw-rw-r-- 1 zc zc 1998 Apr 9 04:52 qplatformdefs.h
编译,关于rpath,参考-L、-rpath和-rpath-link的区别,-mtdev
和-xinput2
选项,在help中可以找到这两个选项。mtdev包含了应用程序对多点触摸协议的支持,xinput2实现了Linux的输入子系统对多点触摸的支持。
make clean
./configure -prefix $cur_path/zynq-$PETALINUX_VER -opensource -release -pch -confirm-license -xplatform linux-arm-gnueabi-g++ -shared -iconv -qt-libpng -qt-libjpeg -no-opengl -no-cups -no-glib -no-dbus -no-rpath -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-openssl
make -j4
make install
若要添加对tslib的支持?
-tslib \
-I tslib_install/include \
-L tslib_install/lib
可能会出现安装失败的情况,这不是错误,直接再编译目录下重新执行命令,可能是编译arm平台的qt有残留,所以编译失败,
$ cd qtmultimedia/
$ make clean && make -j8 && make install
$ cd qtlocation/
$ make clean && make -j8 && make install
$ make install
petalinux2018.2的gcc版本7.2.1,这个版本编译不过,大家还是不要挣扎了,用petalinux2018.3的gcc版本7.3.1
In file included from items/qquickitem_p.h:64:0,
from items/qquickwindow.cpp:45:
items/qquickclipnode_p.h:57:30: error: comdat-local function called by void QQuickWindowIncubationController::incubate() outside its comdat
class Q_QUICK_PRIVATE_EXPORT QQuickDefaultClipNode : public QSGClipNode
^~~~~~~~~~~~~~~~~~~~~
_ZN32QQuickWindowIncubationController28incubatingObjectCountChangedEi.part.85/24483 (virtual void QQuickWindowIncubationController::incubatingObjectCountChanged(int)) @0x1007aba7b0
Type: function definition analyzed
Visibility: comdat_group:_ZN32QQuickWindowIncubationController28incubatingObjectCountChangedEi artificial
Same comdat group as: _ZN32QQuickWindowIncubationController28incubatingObjectCountChangedEi/16405
References:
Referring:
Availability: local
First run: 1
Function flags: body local icf_merged split_part
Called by: _ZN32QQuickWindowIncubationController8incubateEv.part.86/24484 (1.00 per call) _ZN32QQuickWindowIncubationController28incubatingObjectCountChangedEi/16405 (0.24 per call)
Calls: _ZN7QObject10startTimerEiN2Qt9TimerTypeE/23783 (0.37 per call)
items/qquickclipnode_p.h:57:30: internal compiler error: verify_cgraph_node failed
Please submit a full bug report,
with preprocessed source if appropriate.
See <https://bugs.linaro.org> for instructions.
Makefile:67514: recipe for target '.obj/qquickwindow.o' failed
make[3]: *** [.obj/qquickwindow.o] Error 1
make[3]: Leaving directory '/home/qe/program/qt-everywhere-opensource-src-5.9.6/qtdeclarative/src/quick'
Makefile:118: recipe for target 'sub-quick-install_subtargets-ordered' failed
make[2]: *** [sub-quick-install_subtargets-ordered] Error 2
make[2]: Leaving directory '/home/qe/program/qt-everywhere-opensource-src-5.9.6/qtdeclarative/src'
Makefile:59: recipe for target 'sub-src-install_subtargets' failed
make[1]: *** [sub-src-install_subtargets] Error 2
make[1]: Leaving directory '/home/qe/program/qt-everywhere-opensource-src-5.9.6/qtdeclarative'
Makefile:346: recipe for target 'module-qtdeclarative-install_subtargets' failed
make: *** [module-qtdeclarative-install_subtargets] Error 2
海思平台的fb使用需要先初始化mpp框架,首先在load3531.sh
中需要配置显存,
insmod hifb.ko video="hifb:vram0_size:20000,vram1_size:7200,vram2_size:3240,vram3_size:3240,\
vram4_size:7200,vram5_size:128,vram6_size:128" softcursor="off" u32VcmpBufNum=2\
apszLayerMmzNames="mmzname0","mmzname1",,"graphics",,"mmzname0"
参考sample_hifb.c
文件,打开HDMI接口,设置屏幕分辨率、屏幕起始坐标。程序运行后会自动结束,添加如下代码使程序在后台一直运行,然后在后台运行sample_hifb
程序,再运行Qt 程序。
if (pstInfo->ctrlkey == 0)
{
while(1)
sleep(5);
}
hifb叠加可以将qt的GUI与海思的MPI分离,在视频层上叠加上图形层,需要修改linuxfb,再设置QT界面透明显示,
(1) 修改qt-everywhere-opensource-src-5.5.1/qtbase/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
for (int i = 0; i < rects.size(); i++)
{
// -
//mBlitter->drawImage(rects[i], *mScreenImage, rects[i]);
// +
mBlitter->setCompositionMode(QPainter::CompositionMode_Source);
mBlitter->drawImage(rects[i], *mScreenImage, rects[i]);
mBlitter->setCompositionMode(QPainter::CompositionMode_SourceOver);
}
(2) 修改qtbase\src\platformsupport\fbconvenience\qfbscreen.cpp
// -
//mCompositePainter->fillRect(rect, Qt::black);
//+
mCompositePainter->setCompositionMode(QPainter::CompositionMode_Source);
mCompositePainter->fillRect(rect, Qt::transparent);
mCompositePainter->setCompositionMode(QPainter::CompositionMode_SourceOver);
(3) 修改qt程序
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowFlags(Qt::CustomizeWindowHint);
}
海思平台可能会出现安装失败的情况,可能是编译其他平台有残留,
$ cd qtimageformats/src/plugins/imageformats/tiff/
$ make clean && make -j8 && make install
$ cd qtimageformats/src/plugins/imageformats/webp/
$ make clean && make -j8 && make install
$ cd qtmultimedia/
$ make clean && make -j8 && make install
$ cd qtlocation/
$ make clean && make -j8 && make install
$ make install
setAttribute(Qt::WA_AcceptTouchEvents,true);也已添加
看了下发现接收到了鼠标移动的事件,为什么会接收不到触摸屏事件,触摸屏事件应该是先被接收的吧