• 12082阅读
  • 17回复

Qt编写自定义控件插件路过的坑及注意事项 [复制链接]

上一主题 下一主题
离线liudianwu
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2016-12-15
在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(http://www.cnblogs.com/feiyangqingyun/p/6128288.html )目前演示DEMO都是采用提升的方法来显示的,一直有个想法,想做成和QWT一样的可以直接编译集成到Qt Creator中,方便用户直接拖控件使用,即做成Qt Creator的插件,Qt要写Qt Creator的插件极为方便,和新建Qt Widget项目一样的步骤。方法可参见(http://blog.sina.com.cn/s/blog_a6fb6cc90102vsj1.html )以及系列文章(http://blog.csdn.net/giselite/article/category/1178493 )。

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源码。

MINGW Qt Creator集成运行图
window.open('http://www.qtcn.org/bbs/attachment/Mon_1612/44_110085_70bf3fb312ab9ff.jpg?158');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >
MSVC Qt Creator集成运行图


总结了一些Qt黑科技,欢迎大家及大神积极补充,谢谢。
1:编译前复制文件
    src_file = $$PWD/py.db
    dst_file = $$OUT_PWD/bin/py.db    
win32 {
    src_file ~= s,/,\\,g
    dst_file ~= s,/,\\,g    
    #system(copy /y $$src_file $$dst_file)
}
unix {
    system(cp -r -f $$src_file $$dst_file)
}

2:编译完成后复制文件
    src_file = $$PWD/file/*.*
    dst_file = $$OUT_PWD/bin/
win32 {
    src_file ~= s,/,\\,g
    dst_file ~= s,/,\\,g
    QMAKE_POST_LINK += copy $$src_file $$dst_file
}
unix {
    QMAKE_POST_LINK += cp -r -f $$src_file $$dst_file
}

3:根据qt版本号加载子项目
#判断当前qt版本号
QT_VERSION = $$[QT_VERSION]
QT_VERSION = $$split(QT_VERSION, ".")
QT_VER_MAJ = $$member(QT_VERSION, 0)
QT_VER_MIN = $$member(QT_VERSION, 1)

message(qt version: $$QT_VERSION)

#用到了webkit内核,在5.5以上版本移除该子项目
greaterThan(QT_VER_MAJ, 4){
    greaterThan(QT_VER_MIN, 4){
        SUBDIRS -= map
        SUBDIRS -= webkit
    }
}

4:pro指定编译前执行和编译后执行动作
编译前执行
QMAKE_PRE_LINK = cp - f  [source] [destionation]
编译后执行
QMAKE_POST_LINK = cp - f [source] [destination]
多条命令
QMAKE_POST_LINK += copy References\*.dll  Debug\ &
QMAKE_POST_LINK += copy References\*.dll ..\bin\ &
QMAKE_POST_LINK += copy Debug\*.exe ..\bin\

5:pro指定编译文件目录
MOC_DIR             = temp/moc
RCC_DIR             = temp/rcc
UI_DIR              = temp/ui
OBJECTS_DIR         = temp/obj
DESTDIR             = bin
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线toby520

只看该作者 1楼 发表于: 2016-12-15
      
QtQML多多指教开发社区 http://qtclub.heilqt.com
将QtCoding进行到底
关注移动互联网,关注金融
开发跨平台客户端,服务于金融行业
专业定制界面
群号:312125701   373955953(qml控件定做)
离线nikoladi

只看该作者 2楼 发表于: 2016-12-15
像大神学习
离线uidab

只看该作者 3楼 发表于: 2016-12-15
好多经验啊,尤其第一条,我也遇到过,坑死了。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线return

只看该作者 4楼 发表于: 2016-12-16
      
离线what951006

只看该作者 5楼 发表于: 2016-12-17
需要多少年的经验才能发现如此多的优美事物
个人博客 http://blog.csdn.net/what951006?viewmode=list
QQ:842420717
菜b努力变菜鸟!!!
离线zjmmlab

只看该作者 6楼 发表于: 2016-12-17
    
离线自强不吸

只看该作者 7楼 发表于: 2016-12-17
      
自强不吸!
离线mu_de_yu

只看该作者 8楼 发表于: 2016-12-19
离线liuchangyin

只看该作者 9楼 发表于: 2016-12-19
离线alex47451

只看该作者 10楼 发表于: 2016-12-20
好贴mark
离线cy_ygs

只看该作者 11楼 发表于: 2016-12-27
好贴mark
离线richards

只看该作者 12楼 发表于: 2016-12-31
谢刘大师  这个经典
离线aslistener

只看该作者 13楼 发表于: 2017-01-03
老弟, 想使用 QtDesigner 布局, 应该写 designer 插件。 Qt 提供的几个工具, 都是可定制的。 可以在 assistant 里面看具体做法
离线shf1986

只看该作者 14楼 发表于: 2017-01-11
向大神致敬......
QQ:173409750
Atmel SAMA5D3x(QQ群:476153000)
TI AM335x(QQ群:275644633)
Qualcomm/NXP/Freescale iMX6(QQ群:47768065)
嵌入式Qt、MySQL(QQ群:437438881)
离线t1029901995

只看该作者 15楼 发表于: 2017-03-19
Mingw编译出来的dll文件复制到qtcreator 目录下看不到自定义控件怎么回事??
本帖提到的人: @liudianwu
离线trun

只看该作者 16楼 发表于: 2018-01-05
离线foxgod

只看该作者 17楼 发表于: 2020-08-24
你好,我不知道插件和dll有什么区别,还有用qt向导创建插件的时候,那个Qt cereator路径和qt creator构建路径,意思我没有下载SRC,就不能创建插件吗
快速回复
限100 字节
 
上一个 下一个