最近在折腾 Qt 界面库,顺手把 ElaWidgetTools 从拉源码到跑起示例的整个过程捋了一遍。这个库在 GitHub 上口碑不错,走的是 Windows 11 那种圆角+半透明+动态配色的路子,做桌面端工具类软件很合适。这篇就把编译和运行的完整流程写出来,包括我踩过的坑,希望能让后来者少走点弯路。
1. ElaWidgetTools 是什么?为什么值得关注
ElaWidgetTools 是一个基于 Qt 的现代 UI 组件库,作者是 Liniyous。它参考了大量成熟 UI 框架的设计思路,主打圆角卡片、柔和阴影、全局换肤和流畅动画。跟 QSS 那套写样式表的方式不同,ElaWidgetTools 把控件封装好了,开发者直接用现成的ElaWidget、ElaWindow、ElaMessageBar、ElaToggleButton这些类就能搭出接近原生 Win11 风格的界面。
这个库的核心价值在于:它解决了 Qt 原生控件长相“过时”的问题。很多做 Windows 桌面工具的人,界面用 QSS 调来调去还是差口气,ElaWidgetTools 直接帮你把底子打好——从窗口圆角特效到侧边导航栏,再到消息提示条,开箱即用。而且它同时支持 Windows 和 Linux,动态换肤功能对做商城类、设置类界面的项目特别香。
如果你正准备做一个面相客户的小工具、数据看板或者后台管理软件,又不想把时间花在调 QSS 上,这个库绝对值得研究。本篇文章我会以 Qt 5.15.2 + MSVC 2019 64 位这套组合为例,把编译链路上的所有细节讲透。
2. 环境准备:编译器、Qt 版本与构建工具的选择
先说结论:ElaWidgetTools 官方要求 Qt 5.15 或更高版本,编译器支持 MSVC、MinGW 和 GCC。我推荐 Windows 上用 Qt 5.15.2 + MSVC 2019 64 位,原因有三:一是稳定,网上资料多;二是 ElaWidgetTools 很多特性依赖 Windows 平台的 DWM 效果,MSVC 配合更顺;三是 5.15.2 是 5.x 系列最后对普通用户友好的版本。
2.1 下载和安装 Qt
到 Qt 官网下载 5.15.2 安装包时,注意要选对组件。如果你是通过在线安装器,在“选择组件”这一步务必勾选:
- Qt 5.15.2 → MSVC 2019 64-bit
- Qt 5.15.2 → Qt Debug Symbols(可选,方便排查)
- Tools → Qt Creator
如果你是离线安装包,也是同样逻辑。安装路径建议用全英文、不含空格的目录,比如D:\Qt\5.15.2\msvc2019_64。千万别往C:\Program Files这种带空格的路径塞,后面配置 CMake 和编译的时候会哭的。
2.2 安装 Visual Studio 2019 及相关工具链
光有 Qt 还不够,还需要 MSVC 编译器本体。安装 Visual Studio 2019 Community 时,工作负载选择“使用 C++ 的桌面开发”,右侧勾选:
- MSVC v142 生成工具
- Windows 10 SDK(选最新版本即可)
- C++ CMake tools for Windows(可选,用命令行时方便)
装完之后建议验证一遍:打开“开始菜单 → Visual Studio 2019 → Developer Command Prompt”,在里面输入cl,能输出版本号就说明编译器可用。
提示:如果 Win10 系统里同时装了 VS2022,也能用它配 Qt 5.15.2,但在 Qt Creator 里选套件时,编译器要选对应版本的 v143 工具集,否则编译时错乱就麻烦了。稳妥做法是先卸掉旧版或者新建套件。
2.3 构建工具链:CMake 与 Ninja
ElaWidgetTools 的源码结构采用 CMake 构建,同时也保留了.pro文件方便 Qt Creator 直接加载。我个人的习惯是:
- 命令行编译:CMake + Ninja,速度快、输出清爽
- IDE 编译:Qt Creator 加载
ElaWidgetTools.pro,可视化方便
装 CMake 直接到官网下载 Windows 安装包,装完记得把C:\Program Files\CMake\bin加入系统 PATH。Ninja 可以在 Qt 安装目录下的 Tools 里找到,也可以单独下载。命令行下确认版本:
cmake --version ninja --version如果 Ninja 提示找不到动态库,把它所在目录加入 PATH 再试。
3. 源码获取与 ElaWidgetTools 目录结构解析
3.1 从 GitHub 拉取源码
源码地址是https://github.com/Liniyous/ElaWidgetTools。建议用git clone而不是下载 ZIP,因为后续拉更新方便:
git clone https://github.com/Liniyous/ElaWidgetTools.git cd ElaWidgetTools网络条件好的话一口气就下来了。这个仓库体积不大,正常也就几十 MB。下完之后看一眼目录结构:
ElaWidgetTools.pro— qmake 工程文件,Qt Creator 用的CMakeLists.txt— CMake 构建脚本src/— 库核心代码(头文件和源码)Example/— 示例工程(内含 main.cpp 和一堆演示页)logo/— 图标资源
注意Example/里面也有自己的.pro文件,这意味着编译示例前,得先把 src 库编译出来,或者通过工程依赖关系一起构建。如果用.pro,Qt Creator 会自动处理这两个子工程。
3.2 源码里的核心文件速览
刚拿到源码别急着编译,我建议先扫一遍src/下的文件,有四个最关键的:
ElaWidget.h / ElaWidget.cpp— 圆角无边框窗口基类ElaWindow.h / ElaWindow.cpp— 带导航栏的主窗口ElaTheme.h— 主题管理(亮色/暗色切换)ElaApplication.h— 全局应用初始化入口
另外在Example/目录里,ElaWindowExample.h/.cpp是示例窗口的逻辑所在,后续想改东西跑实验,改的就是这些文件。
注意:ElaWidgetTools 对编译器的 C++ 标准要求较高,部分代码用到了 C++17 的特性。配置 CMake 时,需要确保开启了 C++17 或者更高的标准。
4. 编译实操:CMake 与 Qt Creator 双路径解析
编译 ElaWidgetTools 有两种常见方式,一种是纯 Qt Creator + qmake,适合新手;另一种是 CMake + Ninja 命令行,适合集成到自动化构建流程。我两个都跑了一遍,分别说。
4.1 路径 A:Qt Creator 加载 .pro(适合新人)
第一步,打开 Qt Creator,选择你安装好的 Qt 5.15.2 MSVC 2019 64-bit 套件。如果列表里是灰的,点“工具 → 选项 → Kits”,把编译器路径重新指定一下。
第二步,打开ElaWidgetTools.pro。它会自动加载两个子工程:
ElaWidgetTools(库)ElaWidgetToolsExample(示例)
第三步,编译顺序不用操心,qmake 会自动生成依赖关系。直接点左下角的绿色三角按钮或按Ctrl+R编译并运行。第一次编译时间大约 1-3 分钟,具体看机器配置。
编译成功后,Qt Creator 会启动示例窗口。界面左侧是导航栏,点击切换不同控件演示页。如果一切正常,说明编译链路通了。
4.2 路径 B:命令行 CMake + Ninja(适合自动化)
在仓库根目录下建一个build文件夹,执行:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=D:/Qt/5.15.2/msvc2019_64 cmake --build build --config Release这条命令的-DCMAKE_PREFIX_PATH很关键,它告诉 CMake 去哪里找 Qt 的库和 CMake 配置。如果你的 Qt 装在其他路径,就改成你自己的。如果提示找不到 Qt6 或 Qt5,多数情况就是这里配置不对。
CMake 构建完成后,会在build/bin目录下生成:
ElaWidgetTools.dll(核心库)ElaWidgetToolsExample.exe(示例程序)
直接双击运行 exe,系统会提示找不到 Qt 的 DLL。这不是编译失败了,而是运行时没找到 Qt 库。两种解决办法:
方案一(临时):把示例 exe 复制到 Qt 的bin目录下运行。
方案二(正规):用 windeployqt 部署:
windeployqt build/bin/ElaWidgetToolsExample.exewindeployqt 会自动把需要的 Qt DLL 和插件拷到 exe 所在目录。这也是发布 Qt 程序的常规做法。
4.3 用命令行跑 qmake 的补充
如果你还是想用 qmake + nmake,在 Visual Studio 开发者命令行里执行:
D:/Qt/5.15.2/msvc2019_64/bin/qmake.exe ElaWidgetTools.pro nmake release不过 qmake 现在基本是在 Qt Creator 内部使用,命令行下正确性不如 CMake,所以这条路径不推荐初学者上。
5. 编译错误排查:从路径依赖到编译器工具链
我在编译时遇到过几次错误,其中最典型的就是项目标题里提到的那条:
:-1: error: dependent '..\..\..\..\..\..\qt\5.15.2\msvc2019_64\include\qtwidgets' does not exist这条信息看似五花八门,其实就一个核心问题:工程里的 Qt include 路径是相对路径,且解析出来的目录不存在。一般在以下场景中出现:
.pro文件里的INCLUDEPATH写的是相对路径- Qt Creator 的 kit(构建套件)选择错误,导致
QTDIR变量指向不存在的位置 - 源码目录层级过深,导致相对路径
.计算远离实际 Qt 安装路径
5.1 复现“dependent does not exist”的完整排查链路
我当时用 Qt Creator 加载项目后,直接点运行,结果控制台输出那条:-1: error。第一反应不是去改工程文件,而是先确认 Qt Creator 当前使用的套件。
打开“工具 → 选项 → Kits”,看到选中的套件是 “Desktop Qt 5.15.2 MSVC2019 64bit”,但编译器下拉框显示“No compiler”。这就是根源——Qt 安装后没给 Qt Creator 关联到 VS2019 编译器。
解决方法:
第一步,在 Kits 界面点击“编译器”标签页,如果列表空白,点“添加 → MSVC → 检测”,让它自动扫描 VS2019 的工具链。扫描完成后,需要在“创建套件”里重新手动建一个套件,把 Qt 版本设为 5.15.2,C++ 编译器选刚才检测到的 MSVC 2019 x64。
第二步,回到项目工程,在左侧“项目”面板的“Build”页,把当前套件切到新建的套件上,清除所有构建缓存。
第三步,重新编译。
编译后如果还报路径问题,就在.pro里手动指定 Qt 路径:
QT += core gui widgets INCLUDEPATH += D:/Qt/5.15.2/msvc2019_64/include加完之后重新 qmake 并构建。
5.2 编译器版本不对导致的心累
另一个我踩过的坑:Qt 版本是 5.15.2 MSVC2019,但系统默认的 VS 是 2022,编译器变成了 v143。此时容易出现:
error: C2039: “setVersion”: 不是“QSslSocket”的成员看起来像是代码兼容问题,实际是 Qt 库用 v142 编译的,ABI 与 v143 不兼容。解决办法就是强制 Qt Creator 使用正确的编译器。在 Kits 里给套件指定的编译器版本,务必与 Qt 安装包里的 msvc2019_64 后缀一致。
5.3 缺少 Windows SDK 导致的“找不到 windows.h”
这种错误更直白:fatal error C1083: 无法打开包括文件: "windows.h": No such file or directory。原因是 VS 安装时没选 Windows 10 SDK。回到 VS Installer,勾选“Windows 10 SDK”后重启,Qt Creator 再检测编译器即可。
5.4 链接阶段常见的 unresolved external symbol
编译过了、链接挂了,这种情况在 ElaWidgetTools 里也有。典型提示长这样:
error LNK2019: 无法解析的外部符号 "public: struct QMetaObject const * __cdecl ElaWindow::metaObject"九成九是void ElaWindow::paintEvent这些带Q_OBJECT宏的类没有重新跑 moc。解决办法:在 Qt Creator 里执行“构建 → 清理”,再重新构建。一定要确保moc_*.cpp文件重新生成,这是 Qt 项目最经典的问题,不懂的人会以为是代码写错了。
提示:遇到任何 moc 相关报错,优先执行“全量重新构建”,而不是只编译单个文件。
5.5 CMake 构建时的路径陷阱
如果用 CMake 构建,最常见的报错是:
Could not find a package configuration file provided by "Qt5" with any of the following names: Qt5Config.cmake这张图只有一种解法:-DCMAKE_PREFIX_PATH指向 Qt 安装目录,比如D:/Qt/5.15.2/msvc2019_64。注意不要写成include目录,CMake 需要的是 Qt 根目录。
还有人会遇到 CMake 找到了 Qt6 而不是 Qt5,导致一堆Qt6::Widgets not found的报错。解决办法是在 CMakeLists 里明确指定:
set(CMAKE_PREFIX_PATH "D:/Qt/5.15.2/msvc2019_64") find_package(Qt5 5.15.2 REQUIRED COMPONENTS Widgets Gui Core)如果机器上同时存在 Qt5、Qt6,需要给 CMake 设置Qt5_DIR变量指向 Qt5 的 cmake 配置目录。
6. 编译完成后如何运行示例
6.1 直接启动示例程序
无论是 Qt Creator 里按Ctrl+R,还是手动执行ElaWidgetToolsExample.exe,程序启动后你会看到一个现代感很强的窗口,默认是亮色主题,左侧有导航栏,右侧是内容卡片。
首次运行时,建议重点观察三个地方:
- 窗口边缘是否有圆角效果
- 导航栏切换时是否有滑入动画
- 右上角主题切换按钮是否让整体配色实时变化
这三个点任何一个没生效,说明对应特性在你的系统上没跑起来,通常和 DWM 特效未开启、显卡驱动太旧或系统缩放比例设置有关。
6.2 命令行参数与运行时依赖
正常情况下 exe 直接双击就能跑。如果你是从命令行启动的,可能会看到类似这样的输出:
Qt: Untested Windows version 11 detected!这只是一个提示,不影响运行。如果运行时提示缺少ElaWidgetTools.dll,记住先用 windeployqt 部署:
windeployqt --release --no-opengl-sw build/bin/ElaWidgetToolsExample.exe部署完之后,exe 同目录下会出现platforms、styles等文件夹,这些是 Qt 运行的必要插件。发布给别的机器前,这一步必须有。
6.3 示例窗口内部的功能演示
进入示例后,左侧导航栏主要提供几个演示页。可以对每个页面操作一下:
- BasicControls 页面,去看按钮、开关、进度条在不同主题下的表现
- Card 页面,拖拽窗口看卡片阴影是否跟随
- Toast 页面,点击按钮触发消息提示条,观察动画和消失逻辑
需要注意,ElaWidgetTools 的窗口效果依赖系统支持,如果在虚拟机里跑,某些圆角特效、半透明效果可能显示不出来。遇到这种情况别以为是编译出错,先切到真机看效果。
7. 将 ElaWidgetTools 集成到您自己的工程
跑通示例只是一个起点。真正把这个库用到自己的项目里,需要搞明白依赖关系和工程配置。
7.1 在 .pro 工程里集成
自己项目的.pro文件里,加上:
QT += core gui widgets CONFIG += c++17 INCLUDEPATH += D:/ElaWidgetTools/src LIBS += D:/ElaWidgetTools/build/bin/ElaWidgetTools.lib注意 Windows 下链接的是.lib(动态库的导入库),运行的时候才需要同名的.dll。同时需要设置资源文件,ElaWidgetTools 里很多图标是内置资源,需要把它的 qrc 文件引入工程:
RESOURCES += D:/ElaWidgetTools/src/ElaWidgetTools.qrc7.2 在 CMake 工程里集成
在 CMakeLists.txt 里:
cmake_minimum_required(VERSION 3.16) project(MyApp) set(CMAKE_CXX_STANDARD 17) set(CMAKE_AUTOMOC ON) find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets) add_subdirectory(D:/ElaWidgetTools ElaWidgetTools_build) add_executable(MyApp main.cpp) target_link_libraries(MyApp PRIVATE ElaWidgetTools)这里用add_subdirectory的方式,会把 ElaWidgetTools 的源码直接编译进自己的工程,好处是免去预编译库的依赖管理。缺点是首次编译时间会变长。
7.3 写出第一个 ElaWidget 窗口
集成好了之后,代码里这样初始化:
#include <QApplication> #include "ElaApplication.h" #include "ElaWidget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); ElaApplication::getInstance()->init(); // 初始化主题和特效 ElaWidget w; w.setTitle("Hello Ela"); w.resize(800, 600); w.show(); return a.exec(); }关键就在ElaApplication::init(),一定要放在窗口创建之前。没有这一步,后续控件可能不显示圆角动画或者自动换肤功能直接失效。
7.4 动态换肤功能的实现
调用一行代码切换主题:
ElaTheme::getInstance()->setThemeMode(ElaThemeType::Dark);在按钮点击事件里调用,就能立刻让整个应用变为暗色主题。但有个前提:所有窗口必须继承自ElaWidget或ElaWindow,如果你用的是原生QMainWindow,主题切换不会对它产生任何效果。
8. 实际使用中的表现与性能优化建议
8.1 内存与 CPU 占用
示例程序在双屏 2K 环境下,启动后内存约 80-120MB,CPU 空闲时基本为零占用,说明动画框架用了定时器合并策略,没有浪费刷新率。运行过程切换页面时,CPU 峰值短暂冲到 5% 左右,整体可接受。
如果你的界面元素特别多,建议在动画频繁的控件上开启WA_OpaquePaintEvent属性,能减少合成开销。另外尽量少用setStyleSheet混搭,一旦同时使用 QSS 和 ElaWidgetTools 自绘控件,部分特效会被 Qt 样式系统接管,导致动画失效。
8.2 字体渲染问题
默认字体在某些中文系统下会出现中文显示偏小或模糊。建议在初始化时统一设置:
QFont font("Microsoft YaHei UI", 10); a.setFont(font);不同 DPI 缩放下,字体大小需要做适配。ElaWidgetTools 的布局大多用百分比和 sizePolicy,字体变化后基本不会乱,这点设计得比较良心。
8.3 高 DPI 支持
在 main.cpp 顶部一定要加:
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);如果在 Qt 5.15 上不加,高分屏下缩放会糊成一片。Qt 6 已经默认启用,但 Qt 5.15 还必须手动加。
9. 发布部署时需要注意的静态编译与动态库选择
9.1 动态库部署
默认 MSVC 构建出来的 exe,发布时必须带上:
- 你自己构建的
ElaWidgetTools.dll - Qt 的
Qt5Core.dll、Qt5Gui.dll、Qt5Widgets.dll platforms/qwindows.dllstyles/qmodernwindowsstyle.dll(如果需要)
直接在命令行跑windeployqt是最稳的方案,拷完后dumpbin /dependencies可以检查还缺哪些 DLL。
9.2 静态编译的可行性
ElaWidgetTools 可以静态编译,但前提是你的 Qt 本身必须是静态库版本,这要求从源码重新编译 Qt——非常耗时,个人项目一般没必要。多数情况下动态发布即可,exe 加 DLL 一起打包给用户不会太丑。
如果你非要做静态编译,Qt 源码配置时加上-static -release,然后整个工程用静态 Qt 重新编译一次。ElaWidgetTools 本身没有特殊的外部依赖,静态编译兼容性没有大问题,但耗时和磁盘占用要提前有数。
10. 编译运行全流程的个人经验总结
最后把这次实操的经验浓缩成几句:ElaWidgetTools 的编译体验在 Qt 第三方 UI 库里属于比较省心的,只要环境对上了,CMake 和 qmake 都是一次过的水平。真正让新手卡壳的,绝大多数不是库本身的问题,而是 Qt Creator 的套件没配对、编译器版本和 Qt 不匹配、或者构建缓存没清理干净。
如果你是从零开始,我的建议是先按 Qt Creator 流程走一遍,跑通示例后再切换到 CMake 做自动化。第一次编译成功后,那个现代感十足的窗口出来的一瞬间,你会觉得前期配环境的时间花得值。
在把库接进自己的项目之前,最好先通读一遍src/里两三个核心控件的源码,重点看ElaWidget.cpp怎么处理圆角重绘、ElaWindow.cpp怎么管理导航切换动画。这对后面定制自己的界面风格帮助非常大。毕竟这个库的好处,是站在前人封装好的结构上,而不是被封装框架束缚住手脚。