一、 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,有兴趣的同学可以看看。
您随手的一个赞是我分享的动力,谢谢!