VS2017+QT一个dll中包含多个插件

4 篇文章 0 订阅

https://blog.csdn.net/baidu_33662202/article/details/89052254中我已经写过QT如何自定义插件。自定义插件的结果如下图

这里先介绍一个类QDesignerCustomWidgetInterface,这个类是QT用于自定义插件的接口,它的函数如下

 group函数返回的是所在组的名字,比如图中的My Plugins;name函数返回的是插件的名字,比如图中的QtDesignerWidget

如果我们想要实现图中的自定义插件效果,即一个组下面有多个插件;我们可以建立多个dll,让她们返回同一个组名(group函数返回一致);但是,这就麻烦了,所以我们需要把多个插件集成到一个dll中。

1.建立一个qt class library

2. 建立四个类,CustomButton1,CustomButton1Plugin,CustomButton2,CustomButton2Plugin

 右键项目属性,add->add qt class,其中CustomButton1和CustomButton2继承自QWidget,CustomButtonPlugin1和CustomButtonPlugin2继承自QObject和QDesignerCustomWidgetInterface

 CustomButton1类

//h文件

#pragma once

#include <QWidget>

class CustomButton1 : public QWidget
{
	Q_OBJECT

public:
	CustomButton1(QWidget *parent);
	~CustomButton1();
};


//cpp文件
#include "CustomButton1.h"
#include<QPushButton>
#include <QVBoxLayout>
CustomButton1::CustomButton1(QWidget *parent)
	: QWidget(parent)
{
	QVBoxLayout *layout = new QVBoxLayout(this);
	QPushButton *button = new QPushButton(this);
	layout->addWidget(button);
	button->setText("button1");
}

CustomButton1::~CustomButton1()
{
}

当我们在cpp文件中加入qpushbutton 和 qvboxlayout头文件时,可能会报错,这是因为我们没有引入相应的库,比如pushbuton,vboxlayout属于QGUI库,QWidget输入QWidgets库。添加方法为, 选择qt vs tools ->qt project settings,我们勾选相应的qt modules

 

 CustomButton1Plugin类

//h文件

#pragma once

#include <QObject>
#include "QtDesigner/QDesignerCustomWidgetInterface"
class CustomButton1Plugin : public QObject,public QDesignerCustomWidgetInterface
{
	Q_OBJECT
	Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
	CustomButton1Plugin(QObject *parent);
	~CustomButton1Plugin();
	bool isContainer() const;
	bool isInitialized() const;
	QIcon icon() const;
	QString domXml() const;
	QString group() const;
	QString includeFile() const;
	QString name() const;
	QString toolTip() const;
	QString whatsThis() const;
	QWidget *createWidget(QWidget *parent);
	void initialize(QDesignerFormEditorInterface *core);
private:
	bool initialized;
};


//cpp文件
#include "CustomButton1Plugin.h"
#include "CustomButton1.h"
#include <QtCore/QtPlugin>
CustomButton1Plugin::CustomButton1Plugin(QObject *parent)
	: QObject(parent)
{
	initialized = false;
}

CustomButton1Plugin::~CustomButton1Plugin()
{
}



void CustomButton1Plugin::initialize(QDesignerFormEditorInterface * /*core*/)
{
	if (initialized)
		return;

	initialized = true;
}

bool CustomButton1Plugin::isInitialized() const
{
	return initialized;
}

QWidget *CustomButton1Plugin::createWidget(QWidget *parent)
{
	return new CustomButton1(parent);
}

QString CustomButton1Plugin::name() const
{
	return "CustomButton1";
}

QString CustomButton1Plugin::group() const
{
	return "My Plugins";
}

QIcon CustomButton1Plugin::icon() const
{
	return QIcon();
}

QString CustomButton1Plugin::toolTip() const
{
	return QString();
}

QString CustomButton1Plugin::whatsThis() const
{
	return QString();
}

bool CustomButton1Plugin::isContainer() const
{
	return false;
}

QString CustomButton1Plugin::domXml() const
{
	return "<widget class=\"CustomButton1\" name=\"customButton1\">\n"
		"</widget>\n";
}

QString CustomButton1Plugin::includeFile() const
{
	return "CustomButton1.h";
}

 CustomButton2类

//h文件

#pragma once

#include <QWidget>

class CustomButton2 : public QWidget
{
	Q_OBJECT

public:
	CustomButton2(QWidget *parent);
	~CustomButton2();
};


//cpp文件

#include "CustomButton2.h"
#include<QPushButton>
#include <QVBoxLayout>
CustomButton2::CustomButton2(QWidget *parent)
	: QWidget(parent)
{
	QVBoxLayout *layout = new QVBoxLayout(this);
	QPushButton *button = new QPushButton(this);
	layout->addWidget(button);
	button->setText("button2");
}

CustomButton2::~CustomButton2()
{
}

 CustomButton2Plugin类

//.h
#pragma once

#include <QObject>
#include "QtDesigner/QDesignerCustomWidgetInterface"
class CustomButton2Plugin : public QObject,public QDesignerCustomWidgetInterface
{
	Q_OBJECT
	Q_INTERFACES(QDesignerCustomWidgetInterface)

public:
	CustomButton2Plugin(QObject *parent);
	~CustomButton2Plugin();
	bool isContainer() const;
	bool isInitialized() const;
	QIcon icon() const;
	QString domXml() const;
	QString group() const;
	QString includeFile() const;
	QString name() const;
	QString toolTip() const;
	QString whatsThis() const;
	QWidget *createWidget(QWidget *parent);
	void initialize(QDesignerFormEditorInterface *core);
private:
	bool initialized;


};

//cpp
#include "CustomButton2Plugin.h"
#include "CustomButton2.h"
#include <QtCore/QtPlugin>
CustomButton2Plugin::CustomButton2Plugin(QObject *parent)
	: QObject(parent)
{
	initialized = false;
}

CustomButton2Plugin::~CustomButton2Plugin()
{
}



void CustomButton2Plugin::initialize(QDesignerFormEditorInterface * /*core*/)
{
	if (initialized)
		return;

	initialized = true;
}

bool CustomButton2Plugin::isInitialized() const
{
	return initialized;
}

QWidget *CustomButton2Plugin::createWidget(QWidget *parent)
{
	return new CustomButton2(parent);
}

QString CustomButton2Plugin::name() const
{
	return "CustomButton2";
}

QString CustomButton2Plugin::group() const
{
	return "My Plugins";
}

QIcon CustomButton2Plugin::icon() const
{
	return QIcon();
}

QString CustomButton2Plugin::toolTip() const
{
	return QString();
}

QString CustomButton2Plugin::whatsThis() const
{
	return QString();
}

bool CustomButton2Plugin::isContainer() const
{
	return false;
}

QString CustomButton2Plugin::domXml() const
{
	return "<widget class=\"CustomButton2\" name=\"customButton2\">\n"
		"</widget>\n";
}

QString CustomButton2Plugin::includeFile() const
{
	return "CustomButton2.h";
}

3.修改MultiPlugins类

让MultiPlugins继承 QDesignerCustomWidgetCollectionInterface类,QDesignerCustomWidgetCollectionInterface是qt用于把多个插件包含到一个dll的接口

//h文件
#pragma once

#include "multiplugins_global.h"
#include <QtDesigner/QDesignerCustomWidgetCollectionInterface>
class MULTIPLUGINS_EXPORT MultiPlugins
	:public QObject,public QDesignerCustomWidgetCollectionInterface
{
	Q_OBJECT
	Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetCollectionInterface")
	Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
public:
	MultiPlugins(QObject *parent = 0);
	QList<QDesignerCustomWidgetInterface*> customWidgets() const override;

private:
	QList<QDesignerCustomWidgetInterface*> widgets;
};

//cpp

#include "MultiPlugins.h"
#include "CustomButton1Plugin.h"
#include "CustomButton2Plugin.h"
MultiPlugins::MultiPlugins(QObject *parent)
	: QObject(parent)
{
	widgets.append(new CustomButton1Plugin(this));
	widgets.append(new CustomButton2Plugin(this));

}


QList<QDesignerCustomWidgetInterface*> MultiPlugins::customWidgets() const
{
	return widgets;
}

4.生成release版本

5.把multiplugins.dll复制到qt designer下 

 qt designer中的效果

 

可以在qt designer中拖拽使用我们的插件,还必须在项目中包含插件的头文件和源文件。 

积分用不完的朋友:https://download.csdn.net/download/baidu_33662202/11099599

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值