当前位置:   article > 正文

QT中cmakelist项目学习插件功能_qt cmakelist

qt cmakelist

最近在ubuntu中利用qt creator学习qt的插件功能,网上资料较少,记录一下。本文基础建立于在 Qt Creator 上创建 ROS 项目并新建/导入 ROS 包

项目构造如上图,要实现的功能是在rbs_plugins中生成插件文件(.so格式),并在rbs_viz中载入该插件。

一、生成插件

在rbs_plugins中添加插件文件:plugininterface.h(接口文件)  myplugin.h(自己定义的插件类文件) my_plugin.cpp

plugininterface.h代码如下:

  1. // rbs_plugins/plugininterface.h
  2. #ifndef PLUGININTERFACE_H
  3. #define PLUGININTERFACE_H
  4. #include <QStringList>
  5. #include <QtPlugin>
  6. #include <QJsonObject>
  7. class PluginInterface
  8. {
  9. public:
  10. virtual ~PluginInterface() {}
  11. virtual void doSomething() = 0;
  12. };
  13. #define PluginInterface_iid "id123" //必须为接口设置id,id随意就行
  14. Q_DECLARE_INTERFACE(PluginInterface, PluginInterface_iid)
  15. #endif // PLUGININTERFACE_H

myplugin.h:

  1. // rbs_plugins/myplugin.h
  2. #ifndef MYPLUGIN_H
  3. #define MYPLUGIN_H
  4. #include <QObject>
  5. #include "plugininterface.h"
  6. class MyPlugin : public QObject, public PluginInterface
  7. {
  8. Q_OBJECT
  9. Q_INTERFACES(PluginInterface)
  10. Q_PLUGIN_METADATA(IID "id123") //id必须与刚刚接口的id一致
  11. public:
  12. MyPlugin(QObject *parent = nullptr) : QObject(parent) {}
  13. void doSomething() override; //函数必须实现,不能空着
  14. };
  15. #endif // MYPLUGIN_H

myplugin.cpp:

  1. // rbs_plugins/myplugin.cpp
  2. #include "../include/rbs_plugins/myplugin.h"
  3. #include <QDebug>
  4. void MyPlugin::doSomething()
  5. {
  6. qDebug() << "MyPlugin is doing something!";
  7. }
  8. extern "C" PluginInterface* myplugin_instance() {
  9. return new MyPlugin;
  10. }

最重要的是配置cmakelist文件,配置不对会显示meta data载入错误的提示:

  1. cmake_minimum_required(VERSION 3.0.2)
  2. project(rbs_plugins)
  3. set(CMAKE_AUTOMOC ON)
  4. set(CMAKE_AUTOUIC ON)
  5. set(CMAKE_AUTORCC ON)
  6. set(CMAKE_CXX_STANDARD 17)
  7. find_package(catkin REQUIRED COMPONENTS
  8. roscpp
  9. )
  10. find_package(Qt6 REQUIRED Core Widgets)
  11. set(QT_LIBRARIES Qt6::Widgets)
  12. #add
  13. find_package(VTK REQUIRED)
  14. include(${VTK_USE_FILE})
  15. catkin_package()
  16. file(GLOB QT_FORMS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ui/*.ui)
  17. file(GLOB QT_RESOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} resources/*.qrc)
  18. file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/../rbs_plugins/ FOLLOW_SYMLINKS include/rbs_viz/*.hpp *.h)
  19. QT_ADD_RESOURCES(QT_RESOURCES_CPP ${QT_RESOURCES})
  20. QT_WRAP_UI(QT_FORMS_HPP ${QT_FORMS})
  21. QT_WRAP_CPP(QT_MOC_HPP ${QT_MOC})
  22. file(GLOB_RECURSE QT_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}/../rbs_plugins/ FOLLOW_SYMLINKS src/*.cpp)
  23. add_library(myplugin SHARED ${QT_SOURCES} ${QT_RESOURCES_CPP} ${QT_FORMS_HPP} ${QT_MOC_HPP})
  24. target_link_libraries(myplugin PRIVATE Qt6::Core ${QT_LIBRARIES} ${catkin_LIBRARIES} ${VTK_LIBRARIES})
  25. install(TARGETS myplugin LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}/rbs_plugins)

点击重新构建,可以在项目的该路径下看到插件的生成(catkin_rbs/devel/lib/libmyplugin.so)

二、加载插件

将刚刚的接口头文件plugininterface.h移到rbs_viz中的include文件夹中,并在需要载入的cpp文件里#include plugininterface.h,用以下代码进行试验:

  1. QString pluginPath = "/xxx/xxx/catkin_rbs/devel/lib/libmyplugin.so"; //插件所在路径
  2. QPluginLoader pluginLoader(pluginPath);
  3. QObject *plugin = pluginLoader.instance();
  4. if (plugin) {
  5. myPlugin = qobject_cast<PluginInterface *>(plugin);
  6. if (myPlugin) {
  7. qDebug() << "BasePageApi插件加载成功!";
  8. myPlugin->doSomething();
  9. myPlugin->doSomething();
  10. return;
  11. } else {
  12. qDebug() << "无法转换为插件接口";
  13. }
  14. } else {
  15. qDebug() << "插件加载失败:" << pluginLoader.errorString();
  16. }
  17. if (QMessageBox::critical(nullptr, "警告", "BasePageApi插件加载失败!", QMessageBox::Ok) == QMessageBox::Ok) {
  18. qDebug() << "BasePageApi插件加载失败!!";
  19. }

运行结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/658795
推荐阅读
相关标签
  

闽ICP备14008679号