嵌入式 qt 学习笔记
在嵌入式平台 rk3399 上面进行本地编译,会碰到 x86 上没有的问题。
1. stdlib.h not found,原因是头文件位置没有设置。
Tools --> options --> kits --> compile 选择相应的编译器,然后下面的 Header paths 点击 后面的 details,填写头文件地址,比如: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include
2. error: WARNING: unsafe header/library path used in cross-compilation: '-L/usr/lib' qt嵌入式开发,库需要使用交叉编译的库。
在 pro 文件中,加入下面这样的:
LIBS += \
-L/home/book/libarmhf -ltoupcam \
3. qt 输出信息到 console
projects --> run --> Run in terminal 然后在 pro 文件中,增加 CONFIG += console 最后在源文件中,直接使用 qDebug() 就可以输出到 console 了。
参考: https://blog.csdn.net/yizhou2010/article/details/52996673
4. qpixmap fromImage 缺省参数无效。
原因是相应的头文件找不到,或者配置不对。 在 pro 文件里面增加:
INCLUDEPATH += /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/opt/ext-toolchain/arm-linux-gnueabihf/include/c++/6.2.1
INCLUDEPATH += /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/opt/ext-toolchain/arm-linux-gnueabihf/include/c++/6.2.1/arm-linux-gnueabihf
然后会提示 stubs.h 找不到 stubs-soft.h。 经过查找,只有 stubs-hard.h,这个是硬件浮点运算。但是 qt 当中找不到 写相应 预编译 指令的地方。尝试修改两个地方,就可以了。 pro 文件。
QMAKE_CXXFLAGS += -mfloat-abi=hard
QMAKE_CFLAGS += -mfloat-abi=hard
stubs.h 文件
#define __ARM_PCS_VFP
这下相关的函数,就可以正常使用了。
5. 普通类转变为 继承 QObject 的子类,必须 rebuild all,让 qmake 重新运行,否则会一直报错。
6. qt5 的槽 可以不用写 slots。 只要写出 signals.
7. 第三方驱动中 so 文件放在 /usr/lib 下就可以,交叉编译的库需要另外放一个文件夹,然后编译的时候,增加路径即可。
参考: https://www.169it.com/tech-qa-linux/article-224882342649989428.html
8. video0 找不到,首先使用 dmesg | grep usb 来看看 usb 里面有没有 camera 的信息。然后 lsusb 来看看具体几个 usb。通过对比 http://www.ideasonboard.org/uvc/ 看看自己的摄像头是不是 uvc 摄像头。
具体参考: https://blog.csdn.net/weixin_43262513/article/details/88073532
9. qt 中 使用 QImage 显示图像: 如果是 RGB888, 24位存储数据。
QImage img(640,480,QImage::Format_RGB888);//24位
unsigned char * p_bits=img.bits();
for(int i=0;i<640*480*3;i+=3)
{
puiBits[i]=data[i];
puiBits[i+1]=data[i+1];
puiBits[i+2]=data[i+2];
}
QPixmap pixmap=QPixmap::fromImage(img);
pixmap=pixmap.scaled(widget->size());
widget->setAutoFillBackground(true);
QPalette palette;
palette.setBrush(widget->backgroundRole(), QBrush(pixmap));
widget->setPalette(palette);
widget->repaint();
也可以把其中填充数据的地方改为:
for (int y = 0; y < img->height(); y++) {
memcpy(img->scanLine(y), buf + img->bytesPerLine() * y, img->bytesPerLine());
}
具体参考: https://www.cnblogs.com/muyuhu/archive/2012/10/31/2748361.html https://stackoverflow.com/questions/14563180/raw-data-to-qimage
10. 基于 QCamera 的一些使用可以参考:
https://blog.csdn.net/Sun_tian/article/details/88063382 https://blog.csdn.net/ACK_ACK/article/details/99799092
11. qt 图片缩放。
平滑缩放: ui->label->setPixmap(QPixmap::fromImage(*img).scaled(ui->label->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation));
可以使用两级缩放,第一次快速缩放到最终大小的4倍,第二次平滑缩放,这样处理又快又好。 QImage result = img.scaled(800, 600).scaled(200, 150, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
参考: http://blog.sina.com.cn/s/blog_73f981750102uwxj.html https://blog.csdn.net/kfy2011/article/details/77867609 https://www.cnblogs.com/s_agapo/archive/2012/03/14/2395603.html https://blog.csdn.net/keanight/article/details/79150637
12. github 中有一个 toupcam 的代码,可以参考:
https://github.com/JohnDMcMaster/gst-plugin-toupcam
13. usb camera 驱动移植参考:
https://www.cnblogs.com/alan666/p/8311898.html
14. qtcreator 增加 帮助
参考: https://blog.csdn.net/ruglcc/article/details/7996183
还可以安装对应的新版的 qtcreator. 参考: https://blog.csdn.net/L_0x0b/article/details/105965494
15. qtcreator 配置:
kits --> compile --> manual --> c --> custom 里面设置
compile path: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/bin/arm-linux-gnueabihf-gcc
make path: /usr/bin/make
abi: arm, linux, generic, elf, 32bit
macros: mfloat-abi=hard
header path: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include
kits --> compile --> manual --> c++ --> custom 里面设置
compile path: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/bin/arm-linux-gnueabihf-g++
make path: /usr/bin/make
abi: arm, linux, generic, elf, 32bit
macros: mfloat-abi=hard
header path: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/arm-buildroot-linux-gnueabihf/sysroot/usr/include
kits --> qt version --> manual 里面设置
version name: Qt %{Qt:Version} (host)
qmake location: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/bin/qmake
kits --> manual 里面设置
name: 100ask_imx6ull
device type: desktop
device: local pc
sysroot: /home/book/100ask_imx6ull-sdk/Buildroot_2019.02/output/host/bin
c: custom
c++: custom
debugger: system gdb
qt version: 5.14.2