系列文章目录
文章目录
前言
Qt提供两种设计插件的API,可以用于扩展Qt 的功能。
- 高级(high-level) API用于设计插件以扩展 Qt 的功能,例如定制数据库驱动、图像格式、文本编码、定制样式等,QtCreator 里大量采用了插件,单击Qt Creator的主菜单栏的"Help” → "About Plugins”菜单项,会显示Qt Creator里已经安装的各种插件。
- 低级(low-level) API用于创建插件以扩展自己编写应用程序的功能,最常见的就是将自定义Widget 组件安装到 UI设计器里,用于窗口界面设计。
本例程创建一个,但是采用创建 Qt Designer插件的方式来创建这个类,并将其安装到 UI设计器的组件面板里。
一、创建流程
- 第 1 步: 设置插件项目的名称和保存路径,本实例设置项目名称为QSlideSwitch
- 第 2 步:选择项目编译器,可以选择多个编译器,在编译时,再选择具体的编译器。但是实际上只有MSVC2015 32bit编译器是能用的。
注意:
使用Qt 创建的Widget插件,若要在Qt Creator 的UI 设计器里正常显示,编译插件的编译器版本必须和编译 Qt Creator 的版本一致。
-
第3步:设置自定义QWidget类的名称,只需在左侧的Widget classes列表里设置类名,右侧就会自动设置缺省的文件名,这里添加一个类QSlideSwitch。还可以选择一个图标文件作为自定义组件在 UI 设计器组件面板里的显示图标。
-
第4步:显示和设置插件、资源文件名称。本实例缺省的插件名称是qslideswitchplugin,资源文件名称为 icons.qre,一般用缺省的即可。
-
第5 步:完成设置,生成项目。
- QSlideSwitch.pro是插件项目的项目文件,用于实现插件的接口。
- qslideswitchplugin.h 和 qslideswitchplugin.cpp 是插件的头文件和实现文件。
- icons.qrc是插件项目的资源文件,存储了图标。
- qslideswitch.pri 是包含在 QSlideSwitch.pro 项目中的一个项目文件,用于管理自定义组件类。
- qslideswitch.h 和 qslideswitch.cpp 是自定义类QSlideSwitch的头文件和实现文件。
二、插件项目各文件的功能实现
1.QSlideSwitchPlugin
############ qslideswitchplugin.h
--------------------------------------------------------------------------------
#ifndef QSLIDESWITCHPLUGIN_H
#define QSLIDESWITCHPLUGIN_H
#include <QDesignerCustomWidgetInterface>
class QSlideSwitchPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
#endif // QT_VERSION >= 0x050000
public:
QSlideSwitchPlugin(QObject *parent = 0);
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 m_initialized;
};
#endif // QSLIDESWITCHPLUGIN_H
############ qslideswitchplugin.cpp
--------------------------------------------------------------------------------
#include "qslideswitch.h"
#include "qslideswitchplugin.h"
#include <QtPlugin>
QSlideSwitchPlugin::QSlideSwitchPlugin(QObject *parent)
: QObject(parent)
{
m_initialized = false;
}
void QSlideSwitchPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{
if (m_initialized)