C++/Qt 小知识记录7

2024-06-22 20:36
文章标签 c++ qt 记录 知识

本文主要是介绍C++/Qt 小知识记录7,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

工作中遇到的一些小问题,总结的小知识记录:C++/Qt

小知识7

  • 编译FFMPEG遇到的问题
    • CMakeLists.txt配置FFMPEG的依赖方式:
  • x264在Windows下编译生成*.lib
  • VS编译Qt工程时,遇到提示Change Qt Version的情况
  • 在QtOsg的窗口上嵌入子窗口,存在残影的情况
  • QWidget如何根据内容自适应窗口大小

编译FFMPEG遇到的问题

具体的编译方法就略了,可以参考:

https://blog.csdn.net/weixin_58320200/article/details/134010291

主要是调用的时候,因为忽略了一个细节,就导致遇到了依赖问题:
在cpp下引用FFMPEG的头文件,需要用extern添加头文件(在上面的引用文章中其实也提到了):
因为FFmpeg是一个用C语言编写的库,所以要告诉C++编译器以C语言的方式进行编译。
当C++程序调用C语言库时,如果直接包含C语言库的头文件,C++编译器会对库中的函数进行名称修饰,这会导致链接时找不到对应的函数名,因为链接器期望的是原始的C语言函数名。
在这里插入图片描述

CMakeLists.txt配置FFMPEG的依赖方式:

#依赖库
target_link_libraries(${PROJECT_NAME} PRIVATEQt5::CoreQt5::GuiQt5::Widgets${OpenCV_LIBS}${FFmpeg_DIR}/bin/avformat.lib${FFmpeg_DIR}/bin/avcodec.lib${FFmpeg_DIR}/bin/avdevice.lib${FFmpeg_DIR}/bin/avfilter.lib${FFmpeg_DIR}/bin/avutil.lib${FFmpeg_DIR}/bin/postproc.lib${FFmpeg_DIR}/bin/swresample.lib${FFmpeg_DIR}/bin/swscale.lib
)
#头文件
target_include_directories(${PROJECT_NAME}PRIVATE${OpenCV_INCLUDE_DIRS}${FFmpeg_DIR}/includeSrc
)

x264在Windows下编译生成*.lib

在windows下,使用MSYS2的MINGW64编译。

  1. C:\msys64下的msys2_shell.cmd修改:
    set MSYS2_PATH_TYPE=inherit的注释打开,为了能使用MSVC的cl.exe工具:
    在这里插入图片描述
    测试:
    在这里插入图片描述
  2. 用mingw64执行x264的编译脚本:
    在这里插入图片描述
  3. 生成结果,但lib下是libx264.dll.a,不是lib后缀,而且不能直接改,因为ffmpeg依赖时会有问题。
    在这里插入图片描述
  4. 用MinGW的工程转出lib库
    进入bin目录下,对libx264-164.dll进行操作,执行如下操作,先生成def,再生成lib:
    pexports libx264-164.dll > libx264-164.def
    lib /machine:ix86 /def:libx264-142.def
    注意:x64的要执行 lib /machine:x64 /def:libx264-164.def
    在这里插入图片描述
  5. bin目录下的生成结果,可以把lib拷入到lib目录,方便后面的ffmpeg编译:
    在这里插入图片描述
  6. 编译完成ffmpeg后,查看ffmpeg是否关联了x264:
    执行:ffmpeg -h encoder=libx264
    在这里插入图片描述

VS编译Qt工程时,遇到提示Change Qt Version的情况

如图,在编译Qt工程时遇到如下情况,多数情况下是因为VS工程Check到其它机器上后,Qt的路径不匹配,需要手动切换Qt Version。
在这里插入图片描述
一般的方法,在解决方案资源管理器的根目录上,单击右键弹出菜单,选择“Change Solution’s Qt Version”,然后VS的Qt插件会自动build一次关联了Qt的工程。
在这里插入图片描述
如果还是没解决,就只能对指定的工程进行手动切换,在工程的根节点下(注意不是解决方案的根节点),选择“Qt Project Setting”,然后在弹出表格的“Version”行选择本机内的Qt版本:
在这里插入图片描述
在这里插入图片描述
*这种情况在VS+Qt方式,根据向导建立的工程下,会出现,如果使用CMakeLists.txt方式构建VS工程,不会出现,毕竟Qt环境在工程生成的时候就会关联。

在QtOsg的窗口上嵌入子窗口,存在残影的情况

如图为在一个Qt的Osg窗口上,嵌入了一个无边框的QDialog,里面的内容一改变,就导致出现残影的无法刷新(即使手动调用刷新也无法解决)
后来排查,主要是在setWindowFlags,直接把QDialog的属性给覆盖了,导致它就是个QWidge的属性,如果是QWidget嵌入则绘制机制会被影响:
错误的实现:

setWindowFlags(Qt::FramelessWindowHint); //不能这么调用

在这里插入图片描述
正确的实现:

setWindowFlags(windowFlags() | Qt::FramelessWindowHint); //保留QDialog窗口属性的前提下,去掉边框标题栏
setAttribute(Qt::WA_TranslucentBackground); //可支持半透明

在这里插入图片描述

QWidget如何根据内容自适应窗口大小

窗口内的控件设置显隐后,希望窗口大小能根据当前的内容自适应大小。

参考:https://blog.csdn.net/xiaopei_yan/article/details/78930650

  • 方法一:比较“笨”的方法就是根据控件的显隐,计算当前显示的控件的大小,对窗口进行resize。
  • 方法二:QWidget提供了adjustSize()的函数,可以根据当前窗口内显示的内容进行自适应调整。
    在这里插入图片描述
    如图为同一QWidget窗口,只是控件显隐和内容变了,在调用adjustSize()后会自适应内容大小:
    在这里插入图片描述在这里插入图片描述

这篇关于C++/Qt 小知识记录7的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085343

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

Python中4大日志记录库比较的终极PK

《Python中4大日志记录库比较的终极PK》日志记录框架是一种工具,可帮助您标准化应用程序中的日志记录过程,:本文主要介绍Python中4大日志记录库比较的相关资料,文中通过代码介绍的非常详细,... 目录一、logging库1、优点2、缺点二、LogAid库三、Loguru库四、Structlogphp

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关