前言
为了更加优雅地使用我们自己设计出来的控件,Qt提供了这一模板,它可以帮助我们把自己设计的控件也集成到Qt Designer中,这样就可以像Qt自带的控件一样直接使用了。
创建流程
创建项目 → 其他项目 → Qt4 设计师自定义控件

项目名称 → 创建路径 → 下一步
选择MSVC的Release套件 → 下一步 (没有MSVC可以看这篇教程下载)
给新类起个名字 → 勾选代码框架 → 在说明中设置分组,提示信息等(可选) → 下一步
后面一直下一步就ok了。
上面的【说明】中的【分组】体现在这里:
这些就是组名,到时候你的控件就会在你定义的组名下面
项目创建完成后长这样:
这里多了一个pri
层,它的结构和我们平时选择的Qt Widgets Application
模板十分类似,只不过他是用来生成插件的,所以不会有exe文件产生,也就没有main函数。因此你只能build,不能run。
我们在设计的时候,可以忽略pri外面的文件,那些*plugin.h
和*plugin.cpp
是插件的配置文件,你一般不需要动它。
预览效果
前面提到这个模板不能生成exe文件,那我们需要怎么预览我们设计的控件?
有两种方式:
方式 | 适用范围 |
---|---|
使用designer.exe | 只需要预览样式和动画 |
新建Qt Widgets Application 项目 | 涉及复杂测试,如测试信号槽、web请求等 |
为了顺利预览,这里有一张对应的表格,你需要匹配它们
designer | |
---|---|
Qt Creator自带的 | 由MSVC+Release构建 |
mingw包下的 | 由MinGW+Release构建 |
msvc包下的 | 由MSVC+Release构建 |
-
如果你使用Qt Creator的
designer.exe
(这个exe你是找不到的),你需要找到.\Qt\Qt6.5.3\Tools\QtCreator\bin\plugins\designer
这个目录,里面是存放.dll
的地方,你的插件编译后会生成dll
文件(注意得用MSVC+Release编译生成的.dll
),把它拷贝到这个地方,重启你的 Qt Creator 你就可以看见插件了(如果你遇到了问题,别急,先往下看)。 -
如果你使用mingw包下的
designer.exe
,你需要找.\Qt\Qt6.5.3\6.5.3\mingw_64\plugins\designer
,接下来的操作一样,把.dll
文件copy过去就ok了。(注意得使用MinGW+Release编译生成的.dll
) -
如果你使用msvc包下的
designer.exe
,你需要找到.\Qt\Qt6.5.3\6.5.3\msvc2019_64\plugins\designer
,接下来的操作一样,把.dll
文件copy过去就ok了。(注意得使用MSVC+Release编译生成的.dll
)
使用
这是我们的终极目标,这一步完成了才算完成。
使用的时候,我们肯定需要用到【预览效果】中的 新建Qt Widgets Application项目
方式。所以你现在把由MSVC+Release编译的.dll
拷贝到designer
文件夹中了吗?重启了吗?
我们现在打开设计页面,应该就可以看到我们的插件了。
现在你还不能直接跑,还需要引入我们的外部库(.lib
/.a
)
- 添加库
-
选择外部库
-
导入lib
-
点击完成
之后你会在.pro
文件中看到它帮你生成了下面这一坨东西
win32: LIBS += -L$$PWD/../../Button/switch/CtmSwitchButton/build/Desktop_Qt_6_5_3_MSVC2019_64bit-Debug/debug/ -lctmswitchbuttonplugind
INCLUDEPATH += $$PWD/../../Button/switch/CtmSwitchButton
DEPENDPATH += $$PWD/../../Button/switch/CtmSwitchButton
上面的版本是MSVC+Debug版本的.lib
,所以你的项目必须使用MSVC+Debug才能跑。
那如果要切换其他的kits怎么办?那就导入对应的一来就ok了。
【注意】不可以同时导入不同的.lib
/.a
。
纠正一下,最好还是不要使用下面这种分支写法,太容易出错了,而且每次换一下kit就得重新编译,所以大家还是弃用下面的写法吧 。看最下面的
2025-05-09
那有人要问了,我每次都要切来切去太麻烦了。
没关系,我已经为备好了:
win32 {
BasePath = $$PWD/../../Button/switch/CtmSwitchButton/build
MSVCKit = Desktop_Qt_6_5_3_MSVC2019_64bit
MinGWKit = Desktop_Qt_6_5_3_MinGW_64_bit
contains(QMAKE_COMPILER, msvc) {
# MSVC编译器
isDebugBuild: LIBS += -L$${BasePath}/$${MSVCKit}-Debug/debug/ -lctmswitchbuttonplugind
else: LIBS += -L$${BasePath}/$${MSVCKit}-Release/release/ -lctmswitchbuttonplugin
}
else {
# 其他编译器,默认是MinGW
isDebugBuild: LIBS += -L$${BasePath}/$${MinGWKit}-Debug/debug/ -lctmswitchbuttonplugin
else: LIBS += -L$${BasePath}/$${MinGWKit}-Release/release/ -lctmswitchbuttonplugin
}
}
上面代码可以根据你的kits,切换四种版本(前提是你在写插件的时候都编译过哦,所以我一开始就让你们选了四种kits)
你可以先导入一遍,然后把名字改成你自己的就好了。
- MinGW + Release
- MinGW + Debug
- MSVC + Release
- MSVC + Debug
【注意】这里的版本是为.lib
/.a
服务的,不要和.dll
只能使用MSVC+Release搞混了。
.dll
只能使用MSVC+Release是因为Qt Creator自带的designer.exe
就是用MSVC+Release构建的,别记乱了。
这几个版本可以满足我们绝大部分的需求。下面是一些语法介绍,可以了解一下,下次你甚至可以自己写出来,不需要靠ui界面去导入外部库。
语法/指令 | 用法类别 | 含义与作用 | 示例 | 说明 |
---|---|---|---|---|
-L | 链接参数 | 指定库文件所在目录(Library Path) | LIBS += -L$$PWD/libs | 编译器会在该目录下查找 .lib 或 .a 等库文件 |
-l | 链接参数 | 指定要链接的库名,自动补全前缀 lib 和后缀 .lib (MSVC)或 .a (MinGW) | LIBS += -lMyLib | 实际链接的是 libMyLib.a 或 MyLib.lib ,根据编译器自动适配 |
$$var | Qt变量引用 | 引用 Qt 内建或用户定义的变量 | INCLUDEPATH += $$PWD/include | $$PWD 表示当前 .pro 文件目录 |
$${var} | Qt变量延迟展开 | 防止提前展开变量(不常用,特殊场景) | LIBS += -L$${MY_PATH}/lib | 一般写 $$var 就够用了,只有嵌套或特殊变量拼接时需要 $${} |
contains() | 条件判断 | 判断某变量是否包含某个值 | contains(QMAKE_COMPILER, msvc) | 常用于判断当前 Kit 的类型 |
isDebugBuild | 内置变量 | 判断当前是否为 Debug 构建 | isDebugBuild: ... else: ... | 替代手动写 CONFIG(debug, debug) |
不如直接一股脑全加上得了,然后如果哪个文件不存在,你就把哪个给注释掉好了
win32 {
BasePath = $$PWD/../../Button/switch/CtmSwitchButton/build
MSVCKit = Desktop_Qt_6_5_3_MSVC2019_64bit
MinGWKit = Desktop_Qt_6_5_3_MinGW_64_bit
LIBS += -L$${BasePath}/$${MSVCKit}-Debug/debug/ -lctmswitchbuttonplugind
LIBS += -L$${BasePath}/$${MSVCKit}-Release/release/ -lctmswitchbuttonplugin
LIBS += -L$${BasePath}/$${MinGWKit}-Debug/debug/ -lctmswitchbuttonplugin
LIBS += -L$${BasePath}/$${MinGWKit}-Release/release/ -lctmswitchbuttonplugin
}