查看完整版本: [-- Qt编写自定义控件插件路过的坑及注意事项 --]

QTCN开发网 -> Qt 作品展 -> Qt编写自定义控件插件路过的坑及注意事项 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

liudianwu 2016-12-15 10:49

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

在一日一控件的口号下,终于写好了五十几个自定义控件,包括各种仪表盘,各种温度计,各种进度条,各种按钮等,具体可参见(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集成运行图
[attachment=16230]
MSVC Qt Creator集成运行图
[attachment=16231]

总结了一些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

toby520 2016-12-15 12:58
      

nikoladi 2016-12-15 15:24
像大神学习

uidab 2016-12-15 17:24
好多经验啊,尤其第一条,我也遇到过,坑死了。

return 2016-12-16 09:26
      

what951006 2016-12-17 00:43
需要多少年的经验才能发现如此多的优美事物

zjmmlab 2016-12-17 08:44
    

自强不吸 2016-12-17 17:00
      

mu_de_yu 2016-12-19 10:07

liuchangyin 2016-12-19 10:19

alex47451 2016-12-20 13:01
好贴mark

cy_ygs 2016-12-27 15:11
好贴mark

richards 2016-12-31 11:01
谢刘大师  这个经典

aslistener 2017-01-03 11:56
老弟, 想使用 QtDesigner 布局, 应该写 designer 插件。 Qt 提供的几个工具, 都是可定制的。 可以在 assistant 里面看具体做法

shf1986 2017-01-11 14:03
向大神致敬......

t1029901995 2017-03-19 23:08
Mingw编译出来的dll文件复制到qtcreator 目录下看不到自定义控件怎么回事??

trun 2018-01-05 13:41

foxgod 2020-08-24 17:58
你好,我不知道插件和dll有什么区别,还有用qt向导创建插件的时候,那个Qt cereator路径和qt creator构建路径,意思我没有下载SRC,就不能创建插件吗


查看完整版本: [-- Qt编写自定义控件插件路过的坑及注意事项 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled