上一次水文中,老周所介绍的是编译 Qt 的基础模块—— qtbase。一次性编译所有代码可以一劳永逸,但体积相当大,编译时间较长,CPU负载大发热大,风扇转得猛,电费交得多。因此老周更喜欢分开来编译。

qtbase 模块已经能完成一般的 Qt 开发了,毕竟它包含了铁三角—— Core、Gui、Widgets。有这三个硬汉到场,Qt应用就能运行起来。而附加模块是为了特殊需要的,比如 OpenGL。当要用到某模块时再增量编译,这样逼格更高,也省事。

本文老周以编译多媒体模块 qtmultimedia 为例,演示一下如果编辑附加模块。编译附加模块的前提是你已编译并安装好 qtbase 模块(就是老周前一篇水文中说的)。

在编译之前,老周要先说明一个事:在编译qtbase模块时,默认它会编译为 release 模式,即省去一些调试符号文件,使体积更小。但老周通过试验发现,如果qtbase模块在执行 configure 脚本时没有明确加上 -release 参数的话,那附加模块会编译为 debug 模式的。所以,如果你之前在编译 qtbase 模块时没有加 -release 参数,那不妨重新编译一下,反正单个模块编译也很快。

所以,配置命令如下:

configure -prefix G:\Kits\Qt6\installed -release

之后就是跟前面说的一样,cmake --build .、cmake --install .。

-----------------------------------------------------------------------------------------------

编译附加模块无需重新配置,而是通过一个脚本来设置参数。这个脚本位于你最终的安装路径中,比如,老周的是 G:\Kits\Qt6\installed,在 bin 子目录下,有个名为 qt-configure-module 的脚本。Linux 上无后缀,Windows 上为 .bat。

用法也很简单,直接输入:qt-configure-module <附加模块源码路径> 。

只有源代码路径是必须参数,之后是可选参数。这些参数是什么取决于你正在编译的模块——也就是说每个模块的选项不同。可以在模块的源码目录下找到一个叫 config_help.txt 的文本文件,里面会有选项说明。比如,qtmultimedia 模块的选项说明如下:

Multimedia options:

  -pulseaudio .......... Enable PulseAudio support [auto] (Unix only)
-alsa ................ Enable ALSA support [auto] (Unix only)
-no-gstreamer ........ Disable support for GStreamer
-gstreamer [version] . Enable GStreamer support [auto]
With no parameter, 1.0 is tried first, then 0.10.
-evr ................. Enables EVR in WMF [auto]

这些选项没有很详细的说明,想弄明白的话多数要看脚本代码。当然,没兴趣的话就不用看了,其实这些选项一般不用去配置。

接下来,咱们开始干正事。要编译 qtmultimedia 模块,还要下载 qtshadertools 模块。因为 qtmultimedia 依赖 qtshadertools。说白了,咱们要先编译并安装 qtshadertools 模块。

怎么下载就不说了,还是和上次一样,我们先建一些特定的目录,各司其责,这样好管理。

源码目录:G:\Kits\Qt6\src

生成目录(执行build):G:\Kits\Qt6\build

安装目录(最终成品):G:\Kits\Qt6\installed

再次强调下,要以 release 模式编译,qtbase 模块要加 -release 参数。假设你已经编译且安装好 qtbase 模块。在 G:\Kits\Qt6\installed\bin 目录下会有相关的二进制文件。

1、打开 x64 Native Tools Command Prompt for VS 2022(Linux 下不需要)

2、CD 到 build 目录下。cmake 命令在这个目录下运行,就会将文件输出到该目录。

cd /d G:\Kits\Qt6\build

3、执行 qt-configure-module 脚本,配置 qtshadertools 模块。

G:\Kits\Qt6\installed\bin\qt-configure-module.bat G:\Kits\Qt6\src\qtshadertools

4、老样子,先 build 后 install。

cmake --build .
cmake --install .

5、现在,qtshadertools 模块已就绪。注意,一定要执行 install,这样编译 qtmultimedia 模块时,才会找到相关的库。

-------------------------------------------------------------------------------------------

下面该到 qtmultimedia 模块了。把 build 目录中的文件全删除,确保当前目录仍然是 build。

1、配置 qtmultimedia 模块。

G:\Kits\Qt6\installed\bin\qt-configure-module G:\Kits\Qt6\src\qtmultimedia

2、一样,执行这两条 cmake 命令。

cmake --build .
cmake --install .

【注意:这些 cmake 命令的最后都有个点号“.”,表示当前目录,即 build 目录】

好了,多媒体模块 qtmultimedia 编译成功了。再次回到 installed\bin 目录,就能看到它了。

有个带“Widgets”结尾的,它包含 UI 元素(也叫控件),主要是用来呈现视频,要不然用户只能看个寂寞。

========================================================

编译完成后,我们要检验一下是否正确。写一个示例播放个视频试试。

在 VS Code 中随便打开一个目录作为工作区,然后建一个文本文件 CMakeLists.txt。

cmake_minimum_required(VERSION 3.10.0)
project(testApp LANGUAGES CXX) # 导入库
find_package(Qt6 REQUIRED COMPONENTS
Core
Gui
Widgets
Multimedia
MultimediaWidgets)
# 设置变量
set(CMAKE_AUTOMOC TRUE)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE) # 添加源文件并链接库
add_executable(testApp main.cpp)
target_link_libraries(testApp PRIVATE
Qt6::Core
Qt6::Gui
Qt6::Widgets
Qt6::Multimedia
Qt6::MultimediaWidgets
)

除了铁三角,还要导入 Multimedia 和 MultimediaWidgets 两个库。

接着新建代码文件 main.cpp,以下是完整的 C++ 代码。

#include <QApplication>
#include <QWidget>
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QUrl>
#include <QAudioOutput> int main(int argc, char* argv[])
{
QApplication app(argc, argv); // 要播放的文件
QUrl file = QUrl::fromLocalFile("D:\\大山的女儿\\大山的女儿第1集.mp4");
// 播放器
QMediaPlayer *player=new QMediaPlayer;
// 设置文件源
player -> setSource(file);
// 设置音频输出
QAudioOutput *audoutput = new QAudioOutput;
// 音量
audoutput -> setVolume(0.5F);
player -> setAudioOutput(audoutput); // 播放控件
QVideoWidget vd;
// 将此控件设置为视频输出
player -> setVideoOutput(&vd);
// 设置窗口位置
vd.setGeometry(612, 440, 725, 540); // 显示窗口
vd.show();
// 开始播放
player -> play(); return app.exec();
}

file 变量调用静态方法 fromLocalFile 加载本地视频文件,你需要改成你自己的文件路径。

哦,对了,Qt 这个媒体库所支持的解码器是根据系统所安装的解码器来决定的,如果想播放更多格式的视频,可以安装解码包,比如著名的 K-Lite Codec Pack。说白了,WMP 能播放的它就能播放。不要说人家暴风、 PotPlayer 啥都能播放,那些是内置的解码器,.dll 是在安装目录下的,不是安装到系统中的。

另外,在 QMediaPlayer 实例设置 Source 后,不要忘了设置 QAudioOutput,不设置的话,只有画面没有声音的。device 属性不需要设置,它会查找系统默认的音频输出设备。音量可以适当设置一下。

注意音量的值是 float 类型,值在 0 到 1,也就是说,100% 音量是 1.0。官方文档在概览小节中给的示例是错误的,音量值不是 0 - 100,而是 0 - 1。

setVideoOutput 方法引用 QVideoWidget 实例,表示将视频画面输出到这个控件上,不然,啥都看不见。
最后,运行程序,如果看到视频播放,并且有声音,那就OK了。前提是你要用系统能播放的格式。

好了,这个演示就到这儿了,其他模块的编译也是一样的操作。重点是知道用 qt-configure-module 脚本就行了。

完结,收工,开饭。

用VS Code搞Qt6:编译附加模块的更多相关文章

  1. 用VS Code搞Qt6:编译源代码与基本配置

    先说明一下,本水文老周仅讨论新版的 Qt 6,旧版的 Qt 不讨论. 尽管 Qt 有自己的开发环境,但老周必须说句不装逼的话:真的不好用.说起写代码,当然了,用记事本也能写.但是,有个高逼格的工具,写 ...

  2. 用VS Code搞Qt6:至简窗口部件——QWidget

    在正题开始之前,老周照例扯点别的.嗯,咱们扯一下在 VS 2022 下结合 CMake 开发 Qt6 时的环境变量设置问题.在VS Code 中,通够通过 CMake Tools 扩展的配置来设置环境 ...

  3. 用 VS Code 搞 Qt6:信号、槽,以及QObject

    Qt 里面的信号(Signal)和槽(Slot)虽然看着像事件,但它实际上是用来在两个对象之间进行通信的.既然是通信,就会有发送者和接收者. 1.信号是发送者,触发时通过特有的关键字"emi ...

  4. 用 VS Code 搞Qt6:使用 PySide 6

    一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本.此版本命名比较奇葩,叫 PySid ...

  5. 用 VS Code 搞 Qt6:让信号和槽自动建立连接

    Qt 具备让某个对象的信号与符合要求的槽函数自动建立连接.弄起来也很简单,只要调用这个静态方法即可: QMetaObject::connectSlotsByName(...); connectSlot ...

  6. 解决:warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;找到 MSIL .netmodule 或使用 /GL 编译的模块;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)

    参考资料: http://blog.csdn.net/laogaoav/article/details/8544880 http://stackoverflow.com/questions/18612 ...

  7. 解决:warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;找到 MSIL .netmodule 或使用 /GL 编译的模块;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)

    原文链接地址:https://www.cnblogs.com/qrlozte/p/4844411.html 参考资料: http://blog.csdn.net/laogaoav/article/de ...

  8. android 单独编译某个模块

    第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了And ...

  9. Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法

    Linux下Code::Blocks无法编译运行提示 /bin/sh: 1: g++ not found 的解决办法 今天在Ubuntu 12.04 软件中心中选装了Code::Blocks,安装完成 ...

随机推荐

  1. 每天一个 HTTP 状态码 前言

    前前言 在重新开始写博文(其实大多也就最多算是日常笔记小结)之际,就想着从短小精悍的文章入手,就想到了 HTTP 状态码.另外,记得很久之前,看过一个<每天一个 Linux 命令>系列文章 ...

  2. 『忘了再学』Shell基础 — 21、变量的测试与内容置换

    目录 1.什么是变量的测试与内容置换 2.变量的测试与内容置换 3.示例 例1: 例2: 例3: 1.什么是变量的测试与内容置换 我们之前说过,在Shell中,一个变量未定义,和一个变量为空值的输出效 ...

  3. C#语言中的类型转换方法(unfinished)

    一.C#中的数据类型 1.数值类型 2.字符类型 3.字符串类型 4.布尔类型 5.枚举类型 6.Object类型 二.常见的类型转换 从转换方式的角度,类型转换分为隐式转换与显式转换两种. 其中,隐 ...

  4. ruoyi前后端分离版:添加新页面,不需登录也可访问

    添加QRcode页面代码 <template> <div class="register"> <el-form ref="registerF ...

  5. 《HALCON数字图像处理》第一、二章笔记

    目录 第一章 绪论 1.1 图像和图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理及其发展过程 1.2 数字图像处理的步骤和方法 1.3 数字图像处理系统的硬件组成 1.4 数字 ...

  6. PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】

    前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...

  7. 互联网公司目标管理OKR和绩效考核的误区

    最近看了一篇关于「谷歌放弃OKR,转向全新的GRAD系统」的文章,我转到了研发效能DevOps的微信群里,结果引起了大家热烈的讨论,正好我们也在使用 OKR,所以也来谈谈我的理解以及我们应用起来的实际 ...

  8. 物联网无线数传通信模块设备常见的几种Modbus网关

    物联网无线数传通信常见的几种Modbus网关 以下提到Modbus网关均指Modbus RTU转Modbus TCP,并不涉及对Modbus ASCII数据帧的处理,Modbus ASCII仅支持透明 ...

  9. React技巧之打开文件输入框

    原文链接:https://bobbyhadz.com/blog/react-open-file-input-on-button-click 作者:Borislav Hadzhiev 正文从这开始~ 总 ...

  10. 抓包整理外篇fiddler————了解工具栏[一]

    前言 抓包本篇还没写完,因为在工作中,发现有人用fiddler 用的还不是很好,所以去介绍一下这个东西,fiddler大体分为10多个章节. 正文 首先了解一下fiddler的抓包原理哈. 可以看到当 ...