Qt5中创建及使用自定义插件遇到的一些问题

关键词:Qt5、IconEditor、custom plugin、QtCreator、Failed Plugins、自定义插件

       今天,《C++ GUI Programming with Qt 4》看到了第五章自定义IconEditorPlugin的地方。动手尝试过程中,遇到一些问题,记录一下,借前辈之成果,示于后来者。

        开发环境:Win7 64 bit + Qt 5.1.0。

       由于书上是在Qt 4.x讲的,而小伙伴们使用Qt 5.1.0有一段时间了。Qt 5 又不是完全兼容Qt 4.x(至于Qt 4.x -> Qt 5 需要注意的问题,参见:The Transition from Qt 4.x to Qt 5 或者Porting from Qt 4 to Qt 5),所以这次动手尝试颇为不顺,主要遇到两个问题:

 

(1) Qt 5 中开发插件的方法和Qt 4.x有所不同

 

        详情参考这里:Qt5:自定义窗口部件或这里Q_EXPORT_PLUGIN_2 breaks source compat 或者 How to Create Qt Plugins

        开发环境是Qt 5.x,而书籍是以Qt 4.x讲的,的确让刚接触Qt的菜鸟(如我)不知所措。有点参考价值的随书代码,也可能不再适用。幸运的是,已经有小伙伴把这本书的随书代码从Qt 4.x移植到Qt 5中来了:Porting source code of the book C++ GUI Programming with Qt 4 from Qt4 to Qt5 。

        成功解决Qt版本差异带来的问题后,兴冲冲地编译、链接、生成dll文件,但是这个dll该怎么用呢?怎么能够在Qt Designer中像使用内置组件一样使用这个自定义组件呢?这就是下一个问题了。

 

(2) 在Windows中QtCreator无法识别自定义插件


        生成dll后,我把它放置到D:\Qt\Qt5.1.0\5.1.0\msvc2012_64_opengl\plugins\designer下,打开D:\Qt\Qt5.1.0\5.1.0\msvc2012_64_opengl\bin\designer.exe,在左侧的组件栏里找到了IconEditor。拨弄个窗体,拖一个IconEditor,完美!

        接下来,为了了解这个IconEditor和上面自定义的IconEditor类是怎么协同工作的,我打开QtCreator,建立了一个完整的应用程序。这个程序带一个对话框,在QtCreator中打开ui文件,可是发现左侧组件栏里没有我要的IconEditor组件。

        单独打开QtDesigner可以看到,但是在QtCreator中集成的designer界面中却没有IconEditor,怎么回事呢?

        我想,会不会是QtCreator查找插件的路径和QtDesigner不一样,于是便在Qt安装目录中闲逛。别说,还真让我发现了一个地方:D:\Qt\Qt5.1.0\Tools\QtCreator\bin\plugins\designer。在这个文件夹下,已经有几个插件,和D:\Qt\Qt5.1.0\5.1.0\msvc2012_64_opengl\plugins\designer目录下的一模一样。难道我创建的自定义插件也要往这里复制一份吗?

        说干就干,复制完后,重启QtCreator,打开UI设计界面。晕,还没有。难道是QtCreator加载自定义插件需要额外的操作?网上搜索, 找到了QtCreator检测插件是否加载成功的方法:

        在QtCreator中打开项目的界面文件(*.ui),此时QtCreator允许你使用集成的QtDesigner来编辑这个ui文件,然后打开菜单项“工具->界面编辑器->About Qt Designer plugins...”即可查看哪些插件加载成功了,哪些未加载成功(在单独运行的QtDesigner中,打开“帮助->关于插件”菜单也可查看插件加载成功与否)。

        我发现在QtCreator中,自己定义的IconEditor未加载成功(在单独打开的QtDesigner中,加载没有问题):

 

 

        这张图片表示QtCreator找到了插件,但是未成功加载(注意:要让QtCreator找到自定义的插件,必须把它复制到Qt\Qt5.1.0\Tools\QtCreator\bin\plugins\designer目录下,在Qt\Qt5.1.0\5.1.0\msvc2012_64_opengl\plugins\designer目录下的只能让单独运行的QtDesigner加载)。

        找到一条信息:QTCreator's integrated form editor won't load custom widget plugins (Designer does) 。虽然这个问题对我帮助不大,但鉴于这个问题描述的现象和自己的问题极为贴近,便记录下来。继续搜索!

        (此处省略9999字,不过搜索真相的过程是”艰辛“的……)

        最后找到的几篇完美解决问题:

        在QtCreator中使用自定义控件及在vs2010中集成

        QT (win32) Cannot use custom widgets build by itself

        QT自定义控件整合

 

后记:

        其实本来想写的比这要长得多(想把参考过的内容整合总结一下)。无奈本性懒散,又加上眼睛不适,便省却遣词造句、谋篇布局之繁琐,仅仅把比较有价值的参考链接列在文中,靠诸君自己点击阅读了。

 

2014-01-25

多谢CSDN网友cicada_xb的补充


原因在于:独立的qt creator是用msvc库编译的,qt designer是基于mingw编译的.所以只要带了qt包的插件都装不上

http://doc.qt.digia.com/qtcreator-2.4/adding-plugins.html
http://blog.csdn.net/yangxiao_0203/article/details/6896707
http://www.qtcentre.org/threads/30410-compile-plugin-with-msvc

https://code.google.com/p/qt-msvc-installer/

posted @ 2016-07-18 16:58  龙心纹  阅读(5044)  评论(0编辑  收藏  举报