在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等。虽然Qt Designer里的控件可以满足我们大部分的需求,但是有时候,也会产生一些特殊的需要,比如一个输入框,我们要输入的是经纬度,此时就会有两种输入方式,一种是小数形式,一种是度分秒的形式,此时只使用一个简单的LineEdit是无法满足需求的。我们设想构造这样一个输入控件,它可以支持浮点数输入,同时它还具有一个属性,更改这个属性可以使其切换为经纬度输入形式。如果我们的多个窗体上都需要输入经纬度,那么构造这样一个控件,将会非常方便。下面就以此为例,讲解一下如何创建自定义的窗体控件。

第一步:创建QtDesigner自定义控件工程

  打开Qt Creator,创建一个Qt 设计师自定义控件,如下图所示:

  根据向导提示,建立一个新类,取名“Test"(注:首字母大写,不能全小写,不然后面会出错),一直点击”下一点“,完成工程创建。

  工程创建完毕,如下图所示:

第二步:编辑工程代码

  在新建的工程中,Test类没有ui界面文件,我们要手动添加上去,如果没有ui界面文件,工程编译也可以通过,但该控件添加到ctreator后,一打开desinger工具的时候就会直接挂掉。所以,我们可以把原先的Test类的test.c和test.h删除掉,重新添加一个Test类。

 

  新建一个Test类,如下:

  为了减少出错机率,此时不对界面做任何动作。

  在工程头文件”test.h“中添加 “#include <QtUiPlugin/QDesignerExportWidget>”,在类名前添加”QDESIGNER_WIDGET_EXPORT“宏。如下图:

第三步:编译工程

  保存并选择release方式编译。先qmake一下,

  点击左下角的”构建“按钮,进行编译。

  编译完成。此时会生成testplugin.dll和testplugin.lib两个库。

第四步:部署插件

  编译完成后,在输出目录下,找到对应的testplugin.dll和testplugin.lib两个文件。分别拷贝到QT库的designer路径下和QT的IDE工具的designer路径下。

以我本地5.7.0路径为例:(具体以个人的QT安装路径为准)

QT库的designer库路径:C:\software\GRG\Qt\Qt5.7.0\5.7\msvc2013\plugins\designer

QT库的IDE路径:C:\software\GRG\Qt\Qt5.7.0\Tools\QtCreator\bin\plugins\designer

第五步:测试使用插件

  新建一个工程,在工程使用该Test自定义插件。

  1、打开*.ui,在左下角会出现我们前面编译的自定义插件,如下图:

  直接拖拽到ui界面。

  2、在工程所在文件目录中,新建include文件夹,将前面的插件头文件test.h放在该include文件夹中。新建lib文件夹,将前面生成的testplugin.lib静态库放在此lib文件夹中。

  3、打开测试工程的*.pro文件。添加相应的include路径和lib路径。

添加以下内容:

1 LIBS += $$PWD/lib/testplugin.lib
2 INCLUDEPATH += $$PWD/include

如下图:

  4、切换到release编译模式,点击qmake,生成相应的makefile文件。并将前面生成的testplugin.dll动态库添加到release输出目录中。如下图:

  5、点击构建,此时会生成*.exe到release输出目录。

  此时。直接运行*.exe就可以使用该插件了。自定义插件的新建并使用到此算是OK了。

第六步:Qt自定义插件注意事项:

1:每个Qt库bin目录的designer可执行文件都是和该库同一个编译器编译的,可用,如果想要集成到Qt Creator中,则需要注意版本,一般在windows上的Qt Creator版本是MSVC的,则需要对应的Qt库也是MSVC编译的,库版本和编译器版本必须保持一致才能是顺利集成到Qt Creator的重要前提。

2:自定义控件的名称不能小写,否则拖过去的控件自动生成的默认名称和类名一样,会编译通不过。这个问题坑了我很久,造成自动生成的UI代码保存,一直没有怀疑,后面才发现自动生成的代码类名和实例名称一样,冲突导致的。

3:自定义控件类头文件引入,Qt5.7以下版本为#include <QtDesigner/QDesignerExportWidget> 以上版本为#include <QtUiPlugin/QDesignerExportWidget>

4:类名前必须加入 QDESIGNER_WIDGET_EXPORT 宏。否则集成到Qt Creator 中编译会报错。不加的话可以在设计器中加载,但是编译会报错。

5:如果将生成好的dll文件放到Qt库目录下的 plugins\designer 下,可以在 designer 中看到。放到Qt Creator下的 bin\plugins\designer 则可以集成到Qt Creator中。

6:将自定义控件的头文件、dll文件、lib(mingw编译器为.a)文件复制出来,放到include(可自己随便命名,我这里习惯用include)目录,将include目录放到项目的源码文件下,在使用了自定义控件的项目的pro文件中,增加两行 INCLUDEPATH += $$PWD/include   LIBS += $$PWD/include/***.lib(mingw编译器为.a) ,这样可以正常编译,但是编译完成后不能运行,还需要将 对应自定义控件的dll文件复制到可执行文件同一目录即可,至此大功告成。

番外话:大部分文章介绍都是将对应的库文件和头文件放到Qt安装目录对应文件夹下,为什么这里要放到一个include目录,随着项目一起呢?个人是这么理解的,随项目一起,每次都可以很方便的将运行库文件复制到可执行文件同一目录,而不会忘记从Qt库对应目录找该运行库。而且发布代码的时候也可以有个很好的参考。

7:官网提供的Qt Creator版本基本上是MSVC版本,如果需要在mingw的Qt库对应的Qt Creator中集成自定义控件,需要自己用对应的Qt库编译Qt Creator源码。

参考:

http://www.cnblogs.com/feiyangqingyun/p/6182320.html

http://blog.csdn.net/giselite/article/details/12622429

转载于:https://www.cnblogs.com/georgeOfChina/p/7773141.html

Qt编写自定义控件及插件的使用相关推荐

  1. Qt编写自定义控件29-颜色选取面板

    一.前言 这个控件主要是模仿QColorDialog对话框中的颜色选取面板,提供一个十字形状的标识器,鼠标按下开始选取颜色,移动到哪就选择该处的颜色值,对应右侧颜色条放大显示,本控件的难点就是如何绘制 ...

  2. Qt编写自定义控件4-旋转仪表盘

    前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...

  3. Qt编写自定义控件44-天气仪表盘

    一.前言 天气仪表盘控件是所有控件中唯一一个使用了svg矢量图的控件,各种天气图标采用的矢量图,颜色变换采用动态载入svg的内容更改生成的,其实也可以采用图形字体来做,本次控件为了熟悉下svg在Qt中 ...

  4. Qt编写自定义控件3-速度仪表盘

    前言 速度仪表盘,写作之初的本意是用来展示当前测试的网速用的,三色圆环+数码管显示当前速度,Qt自带了数码管控件QLCDNumber,直接集成即可,同时还带有动画功能,其实也可以用在汽车+工业领域等, ...

  5. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  6. Qt编写自定义控件35-GIF录屏控件

    一.前言 在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基 ...

  7. Qt编写自定义控件插件路过的坑及注意事项

    在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/61 ...

  8. QT中自定义控件和插件大致方法

    文章目录 前言 一.方法:右键提升为 二.方法:变为qt插件,作为ui使用 总结 前言 Qt中自带的控件有时候无法满足项目需求,这就需要在原有的控件或者重新编写代码. 一.方法:右键提升为 该方法主要 ...

  9. Qt编写自定义控件:带阴影、圆角、可拉伸的弹窗

    代码: #ifndef SHADOW_WIDGET_H #define SHADOW_WIDGET_H#include <QWidget>class Shadow_Widget : pub ...

最新文章

  1. Asp.net 1.0 升级至 ASP.NET 2.0十个问题总结
  2. 零基础前端笔记(2)html,表格,列表,标签,文本域,表单域
  3. NDK 与 JNI 的关系
  4. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第4章-连通性保持下多移动机器人群集控制
  5. 指标公式c语言源码下载,自用的一个不错的指标 (源码、附图、副图)
  6. Lintcode--2(56)--两数之和
  7. latex 作者加小标_Latex 写期刊论文的小技巧
  8. ubuntu pycharm设置快捷图标_这些Ubuntu中的小技巧,你知道吗?
  9. mysql pxc启动_Percona XtraDB Cluster(PXC) 无法正常启动
  10. 批量修改文件名称的方法
  11. MFC编程记录--图片控件类
  12. STC学习:光敏计数
  13. C++和MFC的常用总结
  14. 使用文本编辑器编写c代码
  15. 向量叉乘公式_大物学习笔记(公式总结)
  16. mysql的安装配置
  17. 0517零散问题整理
  18. 清除COOKIES有什么好处
  19. 递归解决不含连续的1的位串个数的问题
  20. 豆豆趣事[2016年03月]

热门文章

  1. 推荐一个免费的屏幕取色器,鼠标放到的位置自动显示RGB
  2. Android日志拦截器,Retrofit2日志拦截器的使用
  3. python大数据运维库_大数据集群运维(10)Pycharm下安装模块
  4. Java入门算法(滑动窗口篇)丨蓄力计划
  5. python中print怎么用_python的print怎么用
  6. Java库可以软件著作权,(最新整理)软件著作权-源代码范本
  7. shell编程最新总结大全
  8. 不愿意和别人打交道_最不愿与陌生人打交道的星座
  9. 广东省计算机行业发展程度,广东省统计局-2020年1-4月广东规模以上工业生产运行简况...
  10. python 中国社区_python