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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:插件h文件(plugin.h)定义了一个名为Plugin的类,该类继承自QObject和PluginInterface,并实现了PluginInterface的方法。该类用于创建插件的主要功能。其,getName()方法返回插件的名称,getIcon()方法返回插件的图标,creactUi()方法用于创建插件的用户界面,deleteUi()方法用于删除插件的用户界面,isOpenUi()方法用于判断插件的用户界面是否已打开。\[1\] 引用\[2\]:插件cpp文件(plugin.cpp)实现了Plugin类的构造函数和析构函数,以及PluginInterface的方法。构造函数初始化了mWidget成员变量,析构函数用于关闭插件的用户界面。getName()方法返回插件的名称,getIcon()方法返回插件的图标,creactUi()方法用于创建插件的用户界面,deleteUi()方法用于删除插件的用户界面,isOpenUi()方法用于判断插件的用户界面是否已打开。\[2\] 引用\[3\]:自定义的接口(plugininterface.h)定义了一个名为PluginInterface的接口类,该类包含了一些纯虚函数,包括getName()、getIcon()、creactUi()、deleteUi()和isOpenUi()。这些函数在插件的h文件被实现。\[3\] 根据以上引用内容,可以看出,这些文件是用于实现Qt自定义插件管理类的。插件管理类可以通过实现PluginInterface接口来管理插件的加载、卸载和使用插件的h文件定义了插件类的具体实现,包括插件的名称、图标和用户界面的创建和删除等功能。插件的cpp文件实现了插件类的具体逻辑,包括构造函数、析构函数和接口方法的实现。自定义的接口文件定义了插件接口类,包含了插件类需要实现的纯虚函数。通过这些文件,可以实现Qt自定义插件的管理功能。 #### 引用[.reference_title] - *1* *2* *3* [qt实现插件管理与开发](https://blog.csdn.net/weixin_42887343/article/details/122996526)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值