自定义插件
创建自定义插件
1. 创建工程
QT4 Designer PlugIn
后续配置都使用默认值,这里我们创建一个QHist插件。
2. 新建后,直接编译,会产生如下错误
1>LINK : fatal error LNK1181: cannot open input file 'QtDesignerd.lib'
这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障,我这里使用的是
QtDesignerd4.lib(Release版本使用QtDesigner4.lib)。
3. 修改文件,增加声明,如下:
修改前:
#include
class QHist : public QWidget
修改后
#include
#include
class QDESIGNER_WIDGET_EXPORT QHist : public QWidget
如果不执行此操作,后续应用程序连接时,会上报链接错误:
error LNK2019:
4. 实现插件,这里我只是在此控件中绘制了一条直线。
重载paintEvent事件
protected:
void paintEvent(QPaintEvent *event);
void QHist::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawLine(0, 0, 10, 10);
}
这时,编译会报错误,原因是qhist.cpp中还缺少头文件,引入即可消除:
#include
5. 编译Release版本
6. 到此我们就完成了插件的创建;
使用自定义插件(QT Designer)
1. 将编译生成的相关文件拷贝到QT的plugins/designer目录;
2. 将qhist.h文件拷贝到QT所在的include/QtGui目录;
到此,打开QT Designer,即可看到新增的QHist插件了;
使用自定义插件(APP)
1. 将编译生成的相关文件拷贝到用用工程所在的工程目录;
到此,编译应用程序,运行即可正常使用自定义的插件了;
创建多个插件到一个插件库
前面介绍的是生成单个自定义插件,QT还支持将多个自定义插件生成到一个插件库中,如下:
1. 创建一个插件库工程,工程名为MyCustomWidgets;
2. 创建新的类,分别是QHist,QHistPlugin,QScatter,QScatterPlugin,相关实现代码参见上述单个插件的实现,和先前的唯一差别就是:源文件末尾不在需要添加Q_EXPORT_PLUGIN2声明;
3. 修改MyCustomWidgets的定义和实现,如下:
// 头文件
#include
#include
#include "qhistplugin.h"
#include "qscatterplugin.h"
class MyCustomWidgets: public QObject, public QDesignerCustomWidgetCollectionInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
public:
MyCustomWidgets(QObject *parent = 0);
virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const;
private:
QList<QDesignerCustomWidgetInterface*> widgets;
};
// 源文件
#include "mycustomwidgets.h"
MyCustomWidgets::MyCustomWidgets(QObject *parent)
: QObject(parent)
{
widgets.append(new QHistPlugin(this));
widgets.append(new QScatterPlugin(this));
}
QList<QDesignerCustomWidgetInterface*> MyCustomWidgets::customWidgets() const
{
return widgets;
}
Q_EXPORT_PLUGIN(MyCustomWidgets)
这里从QDesignerCustomWidgetCollectionInterface派生了一个子类MyCustomWidgets;
4. 编译Release版本,将此库文件拷贝到Designer相关目录,此时新打开Qt Designer将可以看到两个自定义插件;