文章目录

  • 工程配置
  • 添加自定义控件
  • 插件导出接口实现
  • 使用自定义插件

相比于通过控件提升来使用自定义控件,在Qt Designer中直接使用自定义控件更加方便和直观。这里就介绍一下如编写和注册Qt Designer插件。Qt Designer插件本质上来说就是一个动态库,和普通的动态库的区别是插件中导出了Qt Designer能识别的接口。

工程配置

编写Qt Designer插件,我们先新建一个动态库工程,然后在工程pro文件添加插件需要的模块,实现如下:

#指定插件对应的模块
QT += widgets uipluginTARGET = ColorCombox
TEMPLATE = lib
CONFIG += plugin
CONFIG += c++14#设置导出宏
DEFINES += COLORCOMBOX_LIBRARY#指定输出路径
debug:DESTDIR = $$PWD/../colorComboBox_output/debug/
release:DESTDIR =$$PWD/../colorComboBox_output/release/#设置目标库的名称
TARGET = $$qtLibraryTarget($$TARGET)
INSTALLS += target#指定安装路径
windows {target.path = $$(QTDIR)/../../Tools/QtCreator/bin/plugins/designerdebug:target_lib.files = $$OUT_PWD/debug/$${TARGET}.librelease:target_lib.files = $$OUT_PWD/release/$${TARGET}.libtarget_lib.path = $$(QTDIR)/../../Tools/QtCreator/bin/plugins/designerINSTALLS += target_lib
}linux {target.path = $$(QTDIR)/../../Tools/QtCreator/lib/Qt/plugins/designer/CONFIG += link_pkgconfig
}macx {target.path = "$$(QTDIR)/../../Qt Creator.app/Contents/PlugIns/designer/"target_lib.files = $$OUT_PWD/lib$${TARGET}.dylibtarget_lib.path = "$$(QTDIR)/../../Qt Creator.app/Contents/PlugIns/designer/"INSTALLS += target_lib
}

QT插件工程中需要导入widgets库和uiplugin库,同时为了插件的自动化部署,我们还添加了不同平台下插件的安装目录,这样插件安装之后会自动部署到QtCreator的对应的目录下。

添加自定义控件

配置完工程之后,我们向工程中添加一个自定义控件,这里以一个颜色下拉列表框为例进行说明。对应的实现如下所示:

#ifndef COLORCOMBOBOX_H
#define COLORCOMBOBOX_H
#include <QComboBox>
#include "colorcombox_global.h"
//颜色下拉框
class COLORCOMBOXSHARED_EXPORT ColorComboBox : public QComboBox
{Q_OBJECT
public:explicit ColorComboBox(QWidget *parent = 0);
private slots:void slot_currentIndexChanged(int index);public:bool getShowColorName();QString getColorName();public slots:void setShowColorName(bool showColorName);void setColorName(QString colorName);void initColorItems();signals://名称和颜色变化信号void colorChanged(QString colorName);void colorChanged(QColor color);private://是否显示英文名称bool menableColorName;//当前颜色名称QString mcolorName;
};#endif // COLORCOMBOBOX_H
#include "colorcombox.h"ColorComboBox::ColorComboBox(QWidget *parent) : QComboBox(parent),menableColorName(true)
{initColorItems();connect(this, SIGNAL(currentIndexChanged(int)), this, SLOT(slot_currentIndexChanged(int)));
}void ColorComboBox::slot_currentIndexChanged(int index)
{if (index >= 0){mcolorName = QColor::colorNames().at(index);emit colorChanged(mcolorName);emit colorChanged(QColor(mcolorName));}
}bool ColorComboBox::getShowColorName()
{return menableColorName;
}QString ColorComboBox::getColorName()
{return mcolorName;
}void ColorComboBox::setShowColorName(bool showColorName)
{if (menableColorName != showColorName) {menableColorName = showColorName;}
}void ColorComboBox::setColorName(QString colorName)
{if (mcolorName != colorName){mcolorName = colorName;int index = QColor::colorNames().indexOf(colorName);this->setCurrentIndex(index);}
}void ColorComboBox::initColorItems()
{clear();QStringList colorList = QColor::colorNames();for(QString strColor: colorList){QPixmap pix(this->iconSize());pix.fill(strColor);this->addItem(QIcon(pix), menableColorName ? strColor : "");}
}

插件导出接口实现

通过下拉列表框,我们可以灵活的选取各种需要的颜色的色值。由于导出了对应的符号,我们可以以动态库的形式加载对应的自定义控件。但是这时候Qt Designer还是无法识别我们的自定义控件,为了让Qt Designer识别该插件,我们还需要在工程中添加插件信息描述类,该类继承自QDesignerCustomWidgetInterface,实现如下:

#ifndef COLORCOMBOXPLUGINDESIGNER_H
#define COLORCOMBOXPLUGINDESIGNER_H#include <QtUiPlugin/QDesignerCustomWidgetInterface>//通过继承实现QDesignerCustomWidgetInterface可以让QT的插件系统识别插件信息
class  ColorComboxPluginDesigner : public QObject, public QDesignerCustomWidgetInterface
{Q_OBJECT//声明QT识别的唯一标识符Q_PLUGIN_METADATA(IID "org.masteringqt.customWidget.ColorComboxPluginInterface")//声明实现的插件接口Q_INTERFACES(QDesignerCustomWidgetInterface)
public:ColorComboxPluginDesigner(QObject* parent = 0);//插件的名称QString name() const override;//插件属于哪个组QString group() const override;//插件的提示信息QString toolTip() const override;//插件的描述信息QString whatsThis() const override;//应该包含哪个文件QString includeFile() const override;//插件对应的图标QIcon icon() const override;//是否是一个容器bool isContainer() const override;//创建对应的widgetQWidget* createWidget(QWidget* parent) override;//判断是否初始化了bool isInitialized() const override;void initialize(QDesignerFormEditorInterface* core) override;private:bool mInitialized;
};#endif // COLORCOMBOXPLUGINDESIGNER_H
#include "ColorComboxPluginDesigner.h"
#include "colorcombox.h"ColorComboxPluginDesigner::ColorComboxPluginDesigner(QObject* parent) :QObject(parent),mInitialized(false)
{}QString ColorComboxPluginDesigner::name() const
{return "ColorComboBox";
}QString ColorComboxPluginDesigner::group() const
{return "MyPlugin";
}QString ColorComboxPluginDesigner::toolTip() const
{return "choose color from combobox";
}QString ColorComboxPluginDesigner::whatsThis() const
{return "choose color value from combo";
}QString ColorComboxPluginDesigner::includeFile() const
{return "colorcombox.h";
}QIcon ColorComboxPluginDesigner::icon() const
{return QIcon(":/logo.png");
}bool ColorComboxPluginDesigner::isContainer() const
{return false;
}QWidget* ColorComboxPluginDesigner::createWidget(QWidget* parent)
{return new ColorComboBox(parent);
}bool ColorComboxPluginDesigner::isInitialized() const
{return mInitialized;
}void ColorComboxPluginDesigner::initialize(QDesignerFormEditorInterface* /*core*/)
{if (mInitialized)return;mInitialized = true;
}

ColorComboxPluginDesigner插件继承自两个类,QObject类允许插件使用Qt的对象系统,QDesignerCustomWidgetInterface类描述了插件的信息,并且允许Designer插件系统识别和加载该插件。

继承自QDesignerCustomWidgetInterface的插件需要声明两个宏:
Q_PLUGIN_METADATA声明了该插件在QT元对象系统中的唯一ID
Q_INTERFACES()声明了该插件实现了哪个接口,也就是定义插件的类型。

在ColorComboxPluginDesigner插件中我们描述了插件系统需要使用到的插件的各种显示信息,包括插件名称、分组、描述、图标等等。等这些都添加完成之后,我们就可以将编译好的插件部署到对应的目录一下了。其实本质上就是需要放到QtCreator的Designer插件目录下,供QtCreator加载。加载之后的效果图如下图所示:

之后我们就可以通过设计师自由的拖动和使用我们自定义的控件了,调用效果如下:

使用自定义插件

将插件部署到Deigner插件目录之后,我们只是让设计系统识别到了我们自定义的插件,在编译调用的时候我们还是需要像使用普通动态库那样加载和使用我们编译的动态库。首先在pro文件中导入对应的动态库文件

#添加包含目录
INCLUDEPATH += ../ColorCombox#添加对应的动态库
win32 {debug:LIBS += -L$$PWD/../colorComboBox_output/debug/ -lColorComboxdrelease:LIBS += -L$$PWD/../colorComboBox_output/release/ -lColorCombox
}

之后对工程进行重新编译,这样我们就可以查看自定义控件的效果了,效果图如下:

这里还有一点需要注意,那就是在程序发布的时候,别忘了把自定义的插件库给打包到安装包里面,要不然会报动态库丢失的错误。
参考示例:
链接:https://pan.baidu.com/s/1BPeAXwXLYrSu7naPH6LpVQ
提取码:n88y

Qt插件之Qt Designer插件实现相关推荐

  1. Qt Creator添加Qt Designer插件

    Qt Creator添加Qt Designer插件 添加Qt Designer插件 查找Qt Designer插件 在macOS上配置Qt Designer插件 匹配的构建密钥 添加Qt Design ...

  2. 自定义Qt Designer插件

    采用创建Qt Designer插件的方式来创建QwBattery类,并将其安装到UI设计器的组件面板里.该类的功能与上篇所讲的QmyBattery类功能一样. 要创建UI设计器插件类,单击Qt Cre ...

  3. 【Y忍冬草】Qt中添加第三方插件VTK,Designer中有但Creator中没有

    版本:Qt5.8+VTK7.0 晕菜,之前在用Qt进行第三方插件VTK的时,不管是在Qt Creator中打开还是在Qt Designer中打开,都可以找到这个小东西,结果中间Qt出过一次问题,重新卸 ...

  4. api如何使用_使用插件扩展Qt自身

    如何创建Qt插件? 本篇文章只能回答一半,如何创建扩展Qt自身的插件. Qt提供了两种用于创建插件的API: 用于编写Qt自身扩展的高级API:自定义数据库驱动程序,图像格式,文本编解码器,自定义样式 ...

  5. QT自定义窗口插件在QT Creator的应用

    根据<C++ GUI Programming with Qt 4,Second Edition>中第5章的"在Qt设计师中集成自定义窗口部件"小节,使用插件法生成的窗口 ...

  6. 【Qt】Qt Plugin:Qt插件创建与使用

    插件接口设计 以a+b=c的接口为例:int add(int a, int b) 在 主项目 工程中创建接口文件(一个头文件)eg:Add.h #ifndef ADD_H #define ADD_H# ...

  7. visual studio 2017插件安装qt

    1.工具,扩展和更新 2.选择:联机,搜索关键字"Qt",看好版本,点安装. 3.安装后,重新启动 VS2017,在菜单栏上就会看到"Qt VS Tools"菜 ...

  8. 我的QT Creator学习笔记(二十一)——Qt国际化和Qt插件

    参考文献:<Qt Creator 快速入门>第三版 霍亚飞编著 一.国际化 Qt可以使用Qt Linguist工具完成应用程序的翻译工作,生成.qm文件,然后在不同情况下为应用程序安装不同 ...

  9. 【大话QT之四】ctkPlugin插件系统实现项目插件式开发

    插件式开发体会: 自开始写[大话QT]系列就开始接触渲染客户端的开发,说是开发不如更多的说是维护以及重构,在接手这块的东西之前自己还有点犹豫,因为之前我一直认为客户端嘛,没什么技术含量,总是想做比较有 ...

  10. 在Qt中如何编写插件,加载插件和卸载插件

    Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和卸载这些库.由于在开发项目的过程中,要开发一套插件 ...

最新文章

  1. 一个没法商用,但是好玩有趣的 Python 手绘图形库!
  2. python主进程退出时子进程也退出_主进程被杀死时,如何保证子进程同时退出,而不变为孤儿进程(三)...
  3. Android--手机root获取与判断应用是否获取
  4. 严防ARP病毒的六个步骤
  5. B - Cube HDU - 1220 (数学计数)
  6. php 取字符串的首字母,php取得字符串首字母的方法,php取得字符串_PHP教程
  7. sps的process插件安装包_什么是Process插件?在中介和调节效应分析中有哪些优势和不足?如何下载与安装?...
  8. 印刷机软件测试,印刷测控条与测试版
  9. linux安装软件系列之yum安装
  10. Java中NIO详解
  11. Pr全套视频教程 PR 全套零基础从入门到精通视频教程
  12. oracle tablespace next参数的理解
  13. CSS 样式实现单边阴影
  14. 《遥感云计算与科学分析》GEE教材中配套代码链接
  15. 蓝鲸智云功能剖析介绍
  16. 牛年牛人侃电脑 (素材来自网络)改编 大风
  17. 处理效应模型stata实例_Stata现场班(高级班)讲义
  18. 26MB160A-ASEMI单相整流桥26MB160A
  19. [原创]我的读研两年半(更新6/6/2006)
  20. win 开机、关机 自动发送邮件

热门文章

  1. vs2003常见问题
  2. dB,dBm W之换算关系
  3. 人工智能教程1---科普人工智能
  4. 计算机科学导论佛罗赞第4版,计算机科学导论 原书第4版
  5. 计算机二级南阳理工学院官网,南阳理工学院外国语学院:彩虹之旅 温暖你心...
  6. 形象标识 新松机器人_新松SIASUN工业机器人标志logo设计,品牌设计vi策划
  7. word怎么转pdf,word批量转pdf方法
  8. 开发者服务器怎么发送公众号上的消息,微信公众号发送提醒消息
  9. 方向余弦,向量夹角,向量的投影
  10. Git Windows下配置Merge工具DiffMerge