首页 > 代码库 > Qt编写自定义控件插件路过的坑及注意事项

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集成运行图

技术分享

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编写自定义控件插件路过的坑及注意事项