一篇文章搞懂 Qt 插件机制和图形视图框架,完成云台控制效果

     、 Qt的插件机制是一种能够以插件的形式扩展你的应用程序,并且每一个插件都是独立的,互不影响。在Qt开发工具IDE中其实也大量使用了高级的插件机制,有心的同学可以发现,在IDE中点击“帮助”菜单会发现有一个“关于插件”的Item,你点击进去之后那里面是QtCreator本身自带的插件,你可以启用或禁用各种插件,有兴趣的同学可以自己搞一搞 ^-^...

       插件系统可以分为三部分:

       (1)主系统,也是调用者:通过调用插件管理器,来实现加载和使用插件。

       (2)插件管理器:插件管理器听名字大家也就知道是干什么的了,主要负责管理你需要加载的插件,加载、卸载插件等功能。

       (3)插件本身:插件的创建其实是要遵守插件管理协议的,然后提供给客户想要的效果。

       插件的创建:

       (1)接口的创建

#pragma once

#include <QString>
#include <QtPlugin>
#include <QObject>
#include "pluginMetaData.h"
#include "../VideoMonitorClient/appconfigure.h"

//定义接口
class InterfacePlugin
{

public:
    virtual ~InterfacePlugin() {}
    virtual void recMsgfromManager(PluginMetaData) = 0;
    virtual void sendMsg2Manager(PluginMetaData)   = 0;
    virtual void showWindow(QObject *obj) = 0;

    virtual PlugType getPlugType() = 0;
    virtual void setPlugType() = 0;
};


#define InterfacePlugin_iid "ViDeO.Plugin.InterfacePlugin"

Q_DECLARE_INTERFACE(InterfacePlugin, InterfacePlugin_iid)

   (2)接口实现部分

   

class MainWindow : public InterfacePlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID InterfacePlugin_iid FILE "programmer.json")
    Q_INTERFACES(InterfacePlugin)
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    virtual void recMsgfromManager(PluginMetaData)  Q_DECL_OVERRIDE;
    virtual void showWindow(QObject *obj) Q_DECL_OVERRIDE;
    virtual PlugType getPlugType() Q_DECL_OVERRIDE;
    virtual void setPlugType() Q_DECL_OVERRIDE;


private:
    Ui::MainWindow *ui;
};

    (3)主程序调用插件管理器加载插件:

   

 //加载exe所在目录下 plugin文件夹的所有插件
    QDir path = QDir(qApp->applicationDirPath());
    path.cd("../../plugins");
    foreach (QFileInfo info, path.entryInfoList(QDir::Files | QDir::NoDotAndDotDot))
    {
        QPluginLoader pluginLoader(info.absoluteFilePath());
        QObject *plugin = pluginLoader.instance();
        if (plugin)
        {
            InterfacePlugin *app = qobject_cast<InterfacePlugin*>(plugin);
            if (app)
            {
                if(app->getPlugType() == CatalogueList_Plugin)
                {
                    app->showWindow(ui->widget);

                }
                else if(app->getPlugType() == PTZ_Plugin)
                {
                    app->showWindow(ui->widget_ptz);
                }

            }
        }
    }

 以上三个步骤就和可以完成插件的创建和使用了,还有一个重要的文件不能少,就是插件中的programmer.json文件:

{ 
    "author":"mqk",
    "date" : "2019/09/28",
    "name" : "PTZ_Control",
	"version" : "1.0.0", 
	"des" : "这是一个插件A,按此方法加载插件B、C等",
	"dependencies" : [] 
}

二、Qt图形视图框架的使用:

     看到下面的动图,你就知道这不可能是Qt Designer中的图元,下面的云台控制就是通过QGraphicsItem、QGraphicsScene等图形视图类进行绘制的。

https://blog.csdn.net/qq_25800311/article/details/81002822 这个是博友“南方以北”整理的,非常详尽,大家可以看一下。
 

       实现上面的效果,大家可以分开来做,第一部分是绘制圆,一共是四个同心圆,只是他们的半径不同,在颜色上也加以区分,让云台具有立体感。第二部分是三角形,每个三角形除了位置和角度是变动的,其他的都是共享的。第三部分是跟着鼠标一起动的扇形,这三种图元叠加在一起就达到了这种效果。

      这个链接是我实现的代码https://download.csdn.net/download/weixin_37926485/12275566,有兴趣的同学可以看看。

     您随手的一个赞是我分享的动力,谢谢!

猜你喜欢

转载自blog.csdn.net/weixin_37926485/article/details/105145864