q2nAmor
QT/C++、opengl、opencl、音视频
展开
-
QLineEdit 最右侧添加按钮
【代码】QLineEdit 最右侧添加按钮。原创 2024-05-08 15:53:45 · 585 阅读 · 0 评论 -
QLabel 如何同时显示图片和文字?
表示图片和文字底部对齐。表示此图片被添加到qrc的相对路径。原创 2024-05-08 15:55:14 · 907 阅读 · 1 评论 -
关于linux下实现一个QT悬浮窗要注意的地方
之前被设置,且 setWindowOpacity 一定要在 setWindowFlags(windowFlags() | Qt::Window);之后设置,所以我们在 setPacity 函数的第一行取消 windowflags 后和在倒数第二行有重新设置回去,这样才能保证鼠标透传和透明度均能生效。一般情况下我们想实现一个悬浮窗或者小部件,要求透传鼠标事件,且在大于给定的透明度时又需要拦截鼠标事件,这个悬浮窗当然也要支持透明度设置。有时候透明度设置可以生效但是鼠标又无法透传。原创 2024-04-19 17:02:54 · 398 阅读 · 0 评论 -
QString 字符串操作性能比较
QString 字符串操作性能比较原创 2023-11-09 17:40:32 · 375 阅读 · 0 评论 -
QT MediaPlayer 高玩,利用QAbstractVideoSurface实现单独的解码和渲染
背景 QT MediaPlayer是一个很好用的QT自带的原生多媒体播放器,它的用法可以看相关文档即可,但要在windows下使用的话需要安装解码器,例如 :LAV Filters。今天这篇文章我们分为两部分来讲,一是利用MediaPlayer得到视频的每一帧。二是利用 VideoOutput 显示自定义的数据流。这两个部分是独立的,也就是说第一点我们得到的每一帧都可以自己控制渲染,不管是使用qwidget还是opengl的方式,具体做法可以参考我之前写的两篇文章:QT + VS2015 ,获取VL原创 2021-09-15 17:22:12 · 1716 阅读 · 0 评论 -
Qt for Android(二十) ——Android 用ScheduledFuture替换Timer解决修改系统时间引起定时器挂起的问题
背景 基于上一篇文章,本来做好的NTP对时功能,结果发现一个致命缺陷,将系统时间修改到未来某个时间,然后启动定时器,此时如果再将系统时间改回当前的正确时间,发现定时器挂起了,不运转了。遂查找资料,发现是定时器内部实现的原因。原因分析这个问题我们可以简单跟踪下Timer的源码,Timer中有两个重要的对象,一个是TaskQueue,一个是TimerThread。 TaskQueue 是一个队列,里面放的就是我们调用Timer.schedule时传的参数task。TimerThread 是一个线程,继承原创 2021-08-19 19:31:26 · 914 阅读 · 0 评论 -
Qt for Android(19) —— QT for Android 开发中Native异常捕获与跟踪
背景 QT for Android 的开发不同于纯Android开发,如果是Android端的崩溃我们都是能通过try catch捕获到的,在稳定性运行过程中也能写入文件方便后期排查。但是当发生native异常时android端是无法捕获到的,且有时候logcat也打印不完整,这对于不能稳定复现的问题来说排查问题就会碰到很大的障碍。方案一 幸运的是,在项目初期,我们就可以集成一些第三方工具帮助我们捕获到发生的native异常。所以本文我要提到两个工具,一是我们很早就提到的bugly——http:/原创 2021-08-13 17:37:33 · 700 阅读 · 0 评论 -
Qt for Android(18) —— Android Q 适配之Http请求
升级android 10 后发现项目的Http请求竟然失败了,经过查阅资料,发现在android9.0以上由于安全性高了,如果想要使用http请求的,有以下3种解决方法:1、降级targetSdkVersion的版本未27以下,但是这会导致你的设备又无法运行在android 10 上了,因此相当于没说。2、在manifest.xml文件的application标签下添加android:usesCleartextTraffic="true",它的作用是指示应用程序是否打算使用明文网络流量,例如明文H原创 2021-08-13 16:14:36 · 685 阅读 · 0 评论 -
Qt for Android(17) —— Android 10 适配之开机自启动
背景 项目以前基于android7.0以下运行,静态监听系统的开机广播,然后拉起自己的activity。但是在Android 10 之后,发现方法失效了。经过查阅资料发现:Android 10 (API 级别 29) 及更高版本对后台应用的启动做了限制。Android10中, 当App的Activity不在前台时,其启动Activity会被系统拦截,导致无法启动。详见:google:从后台启动 Activity 的限制这里摘一些概要:Android 10 (API 级别 29) 及更高版本对后原创 2021-08-12 18:25:30 · 1942 阅读 · 1 评论 -
Qt for Android(16) —— Android Q 适配之静默安装
背景 因为项目的特殊性,客户有静默升级的需求。比如说有新版本了,要在不干扰的情况下进行新版本的自安装,完成后自动打开。前提是我们的板卡是有root权限的。在Android Q之前,我们用的方式是通过adb命令:pm install -r实现APK的静默安装。但是在Android Q之后,哪怕拥有了root权限,此方案也行不通了。新方案注:新方案要求APP具有系统签名。首先添加权限:<!--静默安装权限--><uses-permission android:name="原创 2021-08-12 11:56:25 · 944 阅读 · 0 评论 -
Qt for Android(十) —— APP需要全屏显示,如何获取设备的真实宽高?
背景:在做QT for Android 的时候,我们的APP是一个播放类的APP,会有一个全屏显示的需求。在尝试了QT的各种全屏方案之后,发现根本无法做到全屏,要不就是包含了导航栏,要不就是包含了状态栏。因此我们必须另辟蹊径达到全屏效果。在阅读这篇文章之前,建议先阅读之前的文章,因为本文需要有一定的QT 和 Android 交互基础。Qt for Android(一) —— QT 中如何调用android方法Qt for Android(二) —— QT 中调用自定义Android方法详细教程Qt原创 2021-01-22 11:27:08 · 778 阅读 · 0 评论 -
《Qt for Android(11) —— Android Q (10)适配外部存储权限 | 寻找C站宝藏》
背景 之前我们的项目一直是运行在Android5.1和Android7.1.2的系统下,后面有新的需求呀要运行在Android 10下面,当时不知道有多少坑,以为只需要简单的适配即可。但由于我们的应用有一些特殊的需求(后面会提到),因此适配过程中还是有不少坑。问题 从Android Q(即 Android 10)开始,应用访问外部存储的私有目录(即Context.getExternalFilesDir())不需要申请READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_ST原创 2021-06-04 17:17:12 · 1369 阅读 · 1 评论 -
《Qt for Android(12) —— QT for Android 多媒体播放器JNI交互原理和源码分析 | 寻找C站宝藏》
背景 本文旨在对qml的mediaplayer和android的mediaplayer是怎样交互的,qml mediaplayer的play、pause等函数是这样向下传递的,和android mediaplayer的回调函数是怎样响应到qml的槽函数的进行简要的分析和梳理,以便于对这块的内容有一个大概的了解,并清楚原理。建议下载qt5.15的源码,用source insight阅读。源码流程(QT端)1、首先我们在QML中使用MediaPlayer组件,并设置了相关属性,增加了play、pause原创 2021-06-16 16:49:56 · 1199 阅读 · 3 评论 -
Qt for Android(13) —— Android Q 适配之获取唯一标识
背景 之前的唯一标识是通过android.os.Build.SERIAL或者getSerial() 获取,但是Q之后会返回unknow或者空。因此在Android Q 之后此方法便不可行了。我们的项目是运行在瑞星微板卡上的LCD广告机应用,是有有线网口的。在Android Q之后,虽然无线的mac地址会被随机化,但是有线的网口mac地址肯定不会变化了,因此我们的方案是获取etho的mac地址。代码 public String getSerialNumber() { String s原创 2021-08-12 10:42:44 · 744 阅读 · 0 评论 -
Qt for Android(14) —— Android Q 适配之无法接受广播
背景 项目迁移到Android Q之后,发现之前的各种广播都收不到了,包括开机广播、自定义广播等。会提示错误:Background execution not allowed: receiving Intent { act=izis_MinaPushServiceOpen_kyteach flg=0x10 (has extras) } to cn.izis.kyteach/.receiver.DataReceiverPublic后来了解到在Android 8.0之后所有的广播都需要动态注册,也就是以前原创 2021-08-12 10:58:54 · 952 阅读 · 0 评论 -
Qt for Android(15) —— Android Q 适配之截图
背景 之前项目的截图方式是使用的screencap -p命令,在QT中调用android的cmd函数实现截图,但是这个方法的缺陷是慢,截图有时候需要5S。其实在QT中,我们有更好的截图方式。方案介绍在QT5.12版本上,我们尝试过QScreen 的 grabWindow方法,尝试过QWidget的grab方法。这两个方法在android上都没法实现完美截图。基于一些原因,我们升级了QT版本到QT5.15,因为考虑到screencap -p方法的效率比较低,为了优化,便尝试了QPixmap grabW原创 2021-08-12 11:16:40 · 640 阅读 · 0 评论 -
opengl内存泄漏问题
在使用opengl中发现存在内存泄漏,经排查发现下面几个原因:在 glAttachShader 和 glLinkProgram 之后一定要调用下面的代码,防止内存泄漏: glDetachShader(program, GL_VERTEX_SHADER); glDeleteShader(GL_VERTEX_SHADER); glDetachShader(program, GL_FRAGMENT_SHADER); glDeleteShader(GL_FRAGMENT_SHA原创 2020-10-27 10:44:26 · 1900 阅读 · 0 评论 -
Linux Failed to activate swap /swapfile
[FAILED] Failed to activate swap /swapfile.[DEPEND] Dependency failed for Swap.开机时报错如上, 开机之后交换文件无法正确被挂载。因为之前使用g++编译时报错:g++: internal compiler error: Killed (program cc1plus)说是因为内存不足,创建了交换分区后OK了,编译完成后又给删除了。然后重启系统后就出现上面的错误了。因此用dd重新分配即可.sudo dd if=/.原创 2020-10-27 09:51:58 · 4971 阅读 · 0 评论 -
QT 中 QWebSocket 和QTcpSocket 的SSL加密通信设置
一、QWebSocket SLL 自签名证书加密通信案例1.1 单向认证单向认证常见于 Web 通信中,即服务端添加证书,客户端需要验证服务端证书,而服务端不需要验证客户端证书。Player 目前采用单向认证,注意两边选择相同的协议(TLS,SSL都可)。这种情况下服务端需要分别设置一个根(CA)证书,和一个服务端证书,加一个私钥文件,证书格式可以是 crt、cert 等。CA 证书的制作以及 Server 证书和私钥的制作使用 openssl(下载地址:https://www.openssl.or原创 2020-10-24 21:22:47 · 2161 阅读 · 4 评论 -
NDK撩妹三部曲(四)—NDK 开发如何优雅的定位 Native 异常,看这篇就够了
但是原创 2020-06-09 16:07:34 · 20534 阅读 · 8 评论 -
NDK撩妹三部曲(五)— NDK 开发以及 so 库体积优化总结与学习笔记(深度干货,值得收藏)
前段时间做完我们的 SDK 项目,没有关注 so 库大小这块,现在慢慢稳定了就需要追求 so 库体积了。小团队一般可能不会在意这个东西,毕竟现在流量已经不是几年前的奢侈品了。但是要知道so库的大小不仅影响的是应用商店app的大小,还有一个很大的影响就是在广告页面渠道要求的秒下载,太大的app下载速度慢用户会不耐烦,直接影响了这部分用户的转化。本文导航1、从支持的abi架构入手优化7种abi架构简介abi 兼容性Android 加载so库顺序注意事项主流app支持的abi2、gcc/clang编译参数优原创 2020-06-16 21:21:38 · 10118 阅读 · 12 评论 -
IOS 锁屏或切入后台后socket recvfrom失败和sendto失败的解决方案
IOS 锁屏或切入后台后socket recvfrom失败和sendto失败的解决方案背景原因解决方案背景项目中使用 C++ 实现的 UDP通信,并作为 so 库运行在 android 平台和 IOS 平台下。在 ios 手机锁屏再解锁后,或者从前台切换到后台后,发现recvfrom 方法不再阻塞并一直返回失败,同时 sendto 方法也返回失败,查看 errno 错误码发现也是 0(Success)。原因经过查询资料了解到:一般情况下, IOS 在锁屏后,或者说进入后台后,应用程序会被系统挂起,原创 2020-06-07 10:57:48 · 27853 阅读 · 2 评论 -
NDK撩妹三部曲(二)—论“Android 实战如何使用 C++ so 库这个神秘武器?”之带妹实战篇
NDK撩妹三部曲(二)——论“Android 实战如何使用 C++(Qt) so 库这个神秘武器?”之带妹实战篇从何说起? 上礼拜在妹子面前秀了一波后,妹子事后频频要请我喝奶茶,还说我明明可以靠脸吃饭,却偏偏要靠才华(我淦,内外兼修才是我追求的终极奥义)。坚持了3天,终于抵挡不住妹子的热情,当然,妥协是因为饥渴,不对,是因为奶茶,还不对,不是因为奶茶,而是本着助人为乐,共同学习,分享快乐的宗旨,献上我宝贵的“NDK”宝典。拂去1cm厚的灰尘,翻到,328页,对,就是这儿,“论 Android 实战如何原创 2020-06-03 14:50:19 · 28261 阅读 · 4 评论 -
QT 跨平台开发(二)之现有项目在linux和windows下利用NDK 和 Cmake 编译为android so库
导航一. so库编译1. 命令行模式下编译2.QTCreator 工具编译上一篇:windows下qtcreator生成可供android调用的so库下一篇:准备工作在开始之前我们需要学习并做一些准备工作:QT 函数导出QT、QtCreator for android 、ndk(ndk下带有gcc和lang工具,推荐下载r16版本)、cmake、sdk、jdk 安...原创 2019-12-23 11:38:42 · 1461 阅读 · 0 评论 -
QT 跨平台开发(一)windows下qtcreator生成可供android调用的so库
首先,Qt For Android 环境搭建可以参考下面这篇文章:Qt For Android 开发环境配置完成之后我们再次尝试导出一个QT的so库。上面的步骤完成之后,可以看到QTCreator自动帮我们创建了这几个文件:我们对 Test 稍微改造一下,导出函数,而不是导出类,作为动态库时,导出类可能并不是很适用。//test.h#ifndef TEST_H#defin...原创 2019-12-20 17:18:10 · 1972 阅读 · 4 评论 -
YUV 420P 视频裁剪、拼接
一、YUV简介YUV(也称YCbCr)是电视系统所采用的一种颜色编码方法。其中 Y 表示亮度,也就是灰阶值,它是基础信号;U 和 V 表示的则是色度,UV 的作用是描述影像色彩及饱和度,它们用于指定像素的颜色。U和V不是基础信号,它俩都是被正交调制的.YUV与RGB视频信号相比,最大的优点在于只需占用极少的带宽,YUV只需要占用RGB一半的带宽。(摘自百度文库)YUV就是利用一个亮度(Y)...原创 2019-12-11 19:04:28 · 1196 阅读 · 0 评论 -
VLC 音视频播放,支持添加视频列表和循环播放
注:本文基于 C++ 代码讲述 vlc 音视频播放控制过程,且假设你已经集成好了VLC到你的项目中。一、初始化像播放单个视频一样,首先我们需要初始化 instancelibvlc_instance_t m_vlc = libvlc_new(0, 0);而不同于播放单个视频,我们需要的是 libvlc_media_player_t 实例,但是它只支持播放单个媒体,因此我们需要初始化另外一个...原创 2019-12-07 14:24:27 · 30372 阅读 · 0 评论 -
QT程序 windows窗口置顶和linux窗口置顶遇到的问题和解决方案
一、QT 窗口置顶一般情况下,我们开发QT桌面应用程序如需用到窗口置顶操作时,会这样做:setWindowFlags(windowFlags() | Qt::WindowStaysOnTopHint);但经过尝试发现此方法会导致窗口被隐藏,再次调用 show方法又会导致闪烁,查看源码后发现在窗口被创建后(构造函数执行完成后),调用setWindowFlags会导致窗口被 hide,而在构造...原创 2019-12-09 14:58:59 · 5228 阅读 · 1 评论 -
QT利用opengl 进行视频裁剪、拼接,4宫格,9宫格
一、概述1.1 前言在上一篇文章我们讲了Y420P视频数据如何裁剪、拼接、旋转等,但是缺点也很明显,一是工作量大,代码量较大。二是容错率低,因为涉及到大量的浮点型计算,导致在数据拷贝的时候存在误差,可能渲染的时候Y、UV分量就产生问题,视频花屏、变形等。同时,YUV数据拷贝和计算的过程都是交给CPU进行,效率较低。而这篇文章我们采取另外一种更优方式,利用 opengl 顶点和纹理坐标做文章,...原创 2019-12-07 16:04:52 · 2426 阅读 · 4 评论 -
QT插件学习系列(四) linux下试运行
QT插件学习系列(四) linux下试运行关于第一篇文章 QT插件学习系列(一) 初识QtPlugin 末尾提到的 linux 下的测试结果,因为 QT 代码一次编写,跨平台运行,因此我们的 Demo 在 linux下是通用的,下图是运行和测试结果(QTCreator 4.8 ubuntu 18.04):代码我没有做任何改动,可以看到,插件被正确加载,动态库也正确生成。关于 linux...原创 2019-06-03 17:23:16 · 1285 阅读 · 6 评论 -
QT插件学习系列(三) 插件间通信
QT插件学习系列(三) 插件间通信1、 概述前两篇文章学完我们可以从0开始写一个 QT 插件了,也有自己的简易版插件框架了。但是例子中只给出了单个插件的加载与调用,我们实现插件化的目的是为了扩展性,实际项目中会存在插件A,插件B,插件C。而这些插件之间怎么通信 ? 或者说怎么建立一种良好的通信结构,这既是一项必不可少的工作,更是完善我们插件框架的重要里程碑。在我们实现通信机制的时候,要考虑下...原创 2019-06-01 21:37:01 · 31978 阅读 · 16 评论 -
QT插件学习系列(二) 插件管理器
QT插件学习系列(二) 插件管理器1、 概述上文中展示了一个简单的 QT Low-API 插件实例,但是这却满足不了大型应用程序的实际场景,没有扩展性。而插件间的通信、加载卸载(释放内存)、插件元数据、插件生命周期、插件依赖等问题,便是我们要做的。在QT内部,高级 API 有 PluginManager 负责做这些事,但是低级 API 就需要自己写插件管理器来帮助我们解决这些问题。想象一台 ...原创 2019-06-01 21:32:12 · 3594 阅读 · 6 评论 -
QT插件学习系列(一) 初识QtPlugin
QT插件学习系列(一) 初识QtPlugin1、 概述为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢?导出的动态库如果缺失,程序不能运行。但插件可以。同一套代码,即可分别在 windows 下和 linux 下生成插件。QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的...原创 2019-06-01 21:30:18 · 28600 阅读 · 5 评论 -
C++ 多线程通信之 wait、notify、condition_variable 学习日志
C++ 多线程通信之 wait、notify、condition_variable 学习日志1、 C++ 11 线程认识在C++ 11标准库中提供了一种新的线程创建方式:thread t(func, parm);① t.detach(); ② t.join();detach 顾名思义即为工作线程和 UI 线程脱离,是一种异步操作。join 意味着阻塞,等待 func 结束才能继续...原创 2019-05-05 16:34:48 · 9264 阅读 · 2 评论 -
C++ 版本计算器实现(控制台程序),支持负数和小数运算
(QT) C++学习之路之——计算器的实现在学校一直学习的是 Android 应用开发,入职后公司要求转C++(QT) 开发,嫁鸡随鸡。同时公司给新员工有几门培训课程,而每门课都有作业,这篇文章便是“数据结构”这门课的作业说明。PS:控制台的计算器实现,C++代码,可进行加减乘除四则运算,支持负数和小数运算。本计算器的主要特点为:自定义栈和单链表。提供顶层计算接口,由实现类...原创 2018-09-10 13:27:24 · 3127 阅读 · 5 评论 -
(QT) C++ 版本IM通信软件(客户端+服务器文本聊天、文件断点续传、在线用户搜索)
紧接着上一节课程,这次的作业是要求实现一个简易版的“QQ”,可支持“软件需求”所列出的功能。当时由于图方便便选择了QTCPSocket进行整个过程的通信(事后才知道有多坑)。服务端界面比较简单,就几个按钮一个进度条,主要在客户端实现了基本的功能和界面。整个学习和开发阶段持续了将近3个礼拜,可谓是历史悠久。总的来说功能都实现了,但是存在一定的bug,估计以后也没时间去搞了,留在这儿当做一个自我的学习...原创 2018-09-17 08:25:04 · 30240 阅读 · 4 评论 -
VLC源码编译—linux下交叉编译x86和x64版本(附采坑记录)
VLC源码编译—linux下交叉编译x86和x64版本(附采坑记录)官方文档地址:https://wiki.videolan.org/Win32Compile/#Obtaining_the_toolchaingithub地址:https://github.com/videolan/vlc本文参考地址:VMware Ubuntu安装详细过程(非常靠谱):https://blog.csd...原创 2018-10-23 12:18:50 · 2240 阅读 · 6 评论 -
QT + VS2015 ,获取VLC每一帧并渲染到Qwidget
QT + VS2015 ,获取VLC每一帧并渲染到Qwidget1、依赖下载1.1 首先下载VLC依赖动态库和静态库,官网下载(VLC-3.0.4,64位),如需下载32位去 win32 目录下载即可。http://download.videolan.org/pub/videolan/vlc/3.0.4/win64/另外我上传到了csdn:方便大家下载:https://download...原创 2018-11-10 14:55:48 · 2170 阅读 · 2 评论 -
C++ 封装 DLL 供 C# 调用(以C# 调用C++ 二次封装的VLC播放库为介质,支持回调函数的封装)
C++ 封装 DLL 供 C# 调用(以C# 调用C++ 二次封装的VLC播放库为介质,支持回调函数的封装)1、VLC代码封装1.1首先需要配置可使用 VLC 正常播放的 QT(C++)工程,配置过程可参考我之前的一篇文章QT + VS2015 ,获取VLC每一帧并渲染到Qwidget。1.2 首先假设我们已经对 VLC 的 api 进行了简单的基础封装,如下:#pragma once...原创 2019-01-23 15:39:42 · 1604 阅读 · 1 评论 -
手把手教你 linux(ubuntu环境)下打包 QT 程序
linux (ubuntu环境)下发布QT程序到非开发机器1、ldd 查看动态库缺失首先,保证在开发机器上通过 QTCreator 能构建出项目并能运行成功。在 windows 平台下,我们使用 windeployqt 去拷贝动态库,而在 linux 下,也有对应的命令是 ldd 。来到 release文件夹下,使用 ldd VPlayer 命令查看 VPlayer(暂且称我们的程序名为 V...原创 2019-04-03 16:50:57 · 3981 阅读 · 7 评论