用VS Code搞Qt6:编译附加模块
上一次水文中,老周所介绍的是编译 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。

好了,这个演示就到这儿了,其他模块的编译也是一样的操作。重点是知道用 qt-configure-module 脚本就行了。
完结,收工,开饭。
用VS Code搞Qt6:编译附加模块的更多相关文章
- 用VS Code搞Qt6:编译源代码与基本配置
先说明一下,本水文老周仅讨论新版的 Qt 6,旧版的 Qt 不讨论. 尽管 Qt 有自己的开发环境,但老周必须说句不装逼的话:真的不好用.说起写代码,当然了,用记事本也能写.但是,有个高逼格的工具,写 ...
- 用VS Code搞Qt6:至简窗口部件——QWidget
在正题开始之前,老周照例扯点别的.嗯,咱们扯一下在 VS 2022 下结合 CMake 开发 Qt6 时的环境变量设置问题.在VS Code 中,通够通过 CMake Tools 扩展的配置来设置环境 ...
- 用 VS Code 搞 Qt6:信号、槽,以及QObject
Qt 里面的信号(Signal)和槽(Slot)虽然看着像事件,但它实际上是用来在两个对象之间进行通信的.既然是通信,就会有发送者和接收者. 1.信号是发送者,触发时通过特有的关键字"emi ...
- 用 VS Code 搞Qt6:使用 PySide 6
一般来说,用C++写 Qt 应用才是正宗的,不过,为了让小学生也能体验 Qt 的开发过程,或者官方为了增加开发者人数,推出了可用 Python 来编程的 Qt 版本.此版本命名比较奇葩,叫 PySid ...
- 用 VS Code 搞 Qt6:让信号和槽自动建立连接
Qt 具备让某个对象的信号与符合要求的槽函数自动建立连接.弄起来也很简单,只要调用这个静态方法即可: QMetaObject::connectSlotsByName(...); connectSlot ...
- 解决:warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;找到 MSIL .netmodule 或使用 /GL 编译的模块;正在。。;LINK : warning LNK4075: 忽略“/INCREMENTAL”(由于“/LTCG”规范)
参考资料: http://blog.csdn.net/laogaoav/article/details/8544880 http://stackoverflow.com/questions/18612 ...
- 解决: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 ...
- android 单独编译某个模块
第一次下载好Android源代码工程后,我们通常是在Android源代码工程目录下执行make命令,经过漫长的等待之后,就可以得到Android系统镜像system.img了.以后如果我们修改了And ...
- Ubuntu下Code::Blocks无法编译 /bin/sh: 1: g++ not found 解决办法
Linux下Code::Blocks无法编译运行提示 /bin/sh: 1: g++ not found 的解决办法 今天在Ubuntu 12.04 软件中心中选装了Code::Blocks,安装完成 ...
随机推荐
- 每天一个 HTTP 状态码 102
102 Processing 102 Processing 是用于 WebDAV协议 请求的状态码. 这个状态码表示服务器已经收到了客户端的请求,正在处理,但暂时还没有可接触的响应.可以用于防止客户端 ...
- 走进Linux的世界
开源软件Linux的起源: Linux--操作系统. Linux,1991年Linux之父林纳斯 本纳第克特 托瓦兹,创建了Linux操作系统内核(开源). Linux的发行版和RHCE 1.Linu ...
- 这篇 DNS ,写的挺水的。
试想一个问题,我们人类可以有多少种识别自己的方式?可以通过身份证来识别,可以通过社保卡号来识别,也可以通过驾驶证来识别,尽管有多种识别方式,但在特定的环境下,某种识别方法会比其他方法更为适合.因特网上 ...
- pycharm编辑器下载与安装
pycharm编辑器下载与安装 首先是下载地址:https://www.jetbrains.com/pycharm/download/#section=windows 首先根据自己的电脑选择系统, ...
- GDKOI 2021 Day2 PJ 去世记
比赛时和昨天一样困,后面的大奆打代码的速度简直了 T1 用 2.4.6.8 来与 5 抵消掉末尾的 0 ,然后用周期问题的方法直接乘起来并取个位 #include<bits/stdc++.h&g ...
- 【实操干货】做好这 16 项优化,你的 Linux 操作系统焕然一新
大家好,这次跟大家谈谈又拍云的操作系统优化方案.往简单地说,我们使用的 Linux 操作系统主要都是基于 CentOS6/7 的精简和优化.往复杂地说,则是我们有两套系统,业务上使用的定制 Linux ...
- Camunda定时器事件示例Demo(Timer Events)
Camunda定时器事件(Timer Events)是由定义的计时器触发的事件.它们可以用作启动事件.中间事件或边界事件.边界事件可以中断,也可以不中断. Camunda定时器事件包括:Timer ...
- vue内容拖拽放大缩小
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 数字化转型之数字资产知识库(springboot+es+vue+neo4j)
前言 在数字化高度普及的时代,企事业机关单位在日常工作中会产生大量的文档,例如医院制度汇编,企业知识共享库等.针对这些文档性的东西,手工纸质化去管理是非常消耗工作量的,并且纸质化查阅难,易损耗,所以电 ...
- C语言学习之我见-strncpy()字符串复制函数(可控制范围)
strncpy()函数,用于两个字符串值的复制. (1)函数原型 char *strncpy(char * _Dest,const char * _Source,size_t _Count); (2) ...