如何为 Qt Designer 集成自定义小部件(插件)
How to integrate custom widget (plugin) for Qt Designer
我使用 Qt 的向导制作了一个 Qt 自定义设计器小部件。该插件在 Qt Designer 的插件文件夹中编译和安装没有问题,但它没有出现在 Qt 的关于插件中。我使用 QT_DEBUG_PLUGINS 并注意到插件没有出现在调试信息中。但是,当我编译另一个插件(它不是 Qt Designer 的小部件)时,如 SIGBUILD 它似乎已加载。为了集成这些插件,我不知道我在这里做错了什么。这是我用来制作插件的代码示例。有没有人知道如何解决这个问题?
CustomLabel.pro
CONFIG += plugin debug_and_release
TARGET = $$qtLibraryTarget(CustomLabelPlugin)
TEMPLATE = lib
HEADERS = CustomLabelPlugin.h
SOURCES = CustomLabelPlugin.cpp
RESOURCES = icons.qrc
DISTFILES += $$PWD/CustomLabel.json
greaterThan(QT_MAJOR_VERSION, 4) {
QT += designer
} else {
CONFIG += designer
}
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target
include(CustomLabel.pri)
CustomLabelPlugin.h
#ifndef CUSTOMLABELPLUGIN_H
#define CUSTOMLABELPLUGIN_H
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
class CustomLabelPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface" FILE "CustomLabel.json")
#endif // QT_VERSION >= 0x050000
public:
CustomLabelPlugin(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 // CUSTOMLABELPLUGIN_H
CustomLabelPlugin.cpp
#include "CustomLabel.h"
#include "CustomLabelPlugin.h"
#include <QtPlugin>
CustomLabelPlugin::CustomLabelPlugin(QObject *parent)
: QObject(parent)
{
m_initialized = false;
}
void CustomLabelPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{
if (m_initialized)
return;
// Add extension registrations, etc. here
m_initialized = true;
}
bool CustomLabelPlugin::isInitialized() const
{
return m_initialized;
}
QWidget *CustomLabelPlugin::createWidget(QWidget *parent)
{
return new CustomLabel(parent);
}
QString CustomLabelPlugin::name() const
{
return QLatin1String("CustomLabel");
}
QString CustomLabelPlugin::group() const
{
return QLatin1String("ATRWidgets");
}
QIcon CustomLabelPlugin::icon() const
{
return QIcon(QLatin1String(":/iconos/label.ico"));
}
QString CustomLabelPlugin::toolTip() const
{
return QLatin1String("CustomLabel");
}
QString CustomLabelPlugin::whatsThis() const
{
return QLatin1String("This is a custom QLabel...");
}
bool CustomLabelPlugin::isContainer() const
{
return false;
}
QString CustomLabelPlugin::domXml() const
{
return QLatin1String("<widget class=\"ATRWidgets\" name=\"CustomLabel\">\n</widget>\n");
}
QString CustomLabelPlugin::includeFile() const
{
return QLatin1String("CustomLabel.h");
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(CustomLabelPlugin, CustomLabelPlugin)
#endif // QT_VERSION < 0x050000
CustomLabel.json
{
"Name" : "CustomLabel",
"Version" : "1.0.0",
"CompatVersion" : "1.0.0",
"Vendor" : "Asiel Torres",
"Copyright" : "(C) Asiel Torres",
"License" : "Evaluation license.",
"Category" : "Qt Creator",
"Description" : "This plugin presents a custom QLabel.",
"Url" : ""
}
在做一些测试时,我发现 Qt 中有奇怪的工作方式。例如,如果我将插件从 designer 文件夹移动到 imageformats 文件夹,那么 Qt 会检测到插件,然后插件的信息会出现在 Qt 调试中。根据 Qt 文档,插件放置在 Qt 搜索加载插件的任何文件夹中。那么为什么信息出现在一个插件文件夹的调试中而不是另一个?不管怎样,插件的信息显示在调试中,但 Qt 不加载它。这是我从 Qt 调试信息中得到的:
QFactoryLoader::QFactoryLoader() checking directory path "/home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats" ...
QFactoryLoader::QFactoryLoader() looking at "/home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats/libCustomLabel.so"
Found metadata in lib /home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats/libCustomLabel.so, metadata=
{
"IID": "org.qt-project.Qt.QDesignerCustomWidgetInterface",
"archreq": 0,
"className": "CustomLabelPlugin",
"debug": false,
"version": 331520
}
Got keys from plugin meta data ()
经过更多研究后,我找到了解决方案并解决了问题。似乎 Designer 的插件必须放在 QT_INSTALL_PATH/Tools/QtCreator/lib/Qt/plugins/designer/ 文件夹中,而不是 $$[QT_INSTALL_PLUGINS]/designer 就像 Qt 的向导一样。作为 QT_INSTALL_PATH 安装 Qt 的文件夹。为了确认 Qt 加载了插件,我们最常在 Qt 中打开一个表单编辑器然后转到 Tools/Form Editor/About Qt Designer Plugins... 注意我们必须有在设计器中打开一个表单,以便此菜单起作用。此菜单将显示所有已加载的插件,并允许我们刷新插件,以防我们想要动态加载新插件。
我使用 Qt 的向导制作了一个 Qt 自定义设计器小部件。该插件在 Qt Designer 的插件文件夹中编译和安装没有问题,但它没有出现在 Qt 的关于插件中。我使用 QT_DEBUG_PLUGINS 并注意到插件没有出现在调试信息中。但是,当我编译另一个插件(它不是 Qt Designer 的小部件)时,如 SIGBUILD 它似乎已加载。为了集成这些插件,我不知道我在这里做错了什么。这是我用来制作插件的代码示例。有没有人知道如何解决这个问题?
CustomLabel.pro
CONFIG += plugin debug_and_release
TARGET = $$qtLibraryTarget(CustomLabelPlugin)
TEMPLATE = lib
HEADERS = CustomLabelPlugin.h
SOURCES = CustomLabelPlugin.cpp
RESOURCES = icons.qrc
DISTFILES += $$PWD/CustomLabel.json
greaterThan(QT_MAJOR_VERSION, 4) {
QT += designer
} else {
CONFIG += designer
}
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target
include(CustomLabel.pri)
CustomLabelPlugin.h
#ifndef CUSTOMLABELPLUGIN_H
#define CUSTOMLABELPLUGIN_H
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
class CustomLabelPlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_INTERFACES(QDesignerCustomWidgetInterface)
#if QT_VERSION >= 0x050000
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface" FILE "CustomLabel.json")
#endif // QT_VERSION >= 0x050000
public:
CustomLabelPlugin(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 // CUSTOMLABELPLUGIN_H
CustomLabelPlugin.cpp
#include "CustomLabel.h"
#include "CustomLabelPlugin.h"
#include <QtPlugin>
CustomLabelPlugin::CustomLabelPlugin(QObject *parent)
: QObject(parent)
{
m_initialized = false;
}
void CustomLabelPlugin::initialize(QDesignerFormEditorInterface * /* core */)
{
if (m_initialized)
return;
// Add extension registrations, etc. here
m_initialized = true;
}
bool CustomLabelPlugin::isInitialized() const
{
return m_initialized;
}
QWidget *CustomLabelPlugin::createWidget(QWidget *parent)
{
return new CustomLabel(parent);
}
QString CustomLabelPlugin::name() const
{
return QLatin1String("CustomLabel");
}
QString CustomLabelPlugin::group() const
{
return QLatin1String("ATRWidgets");
}
QIcon CustomLabelPlugin::icon() const
{
return QIcon(QLatin1String(":/iconos/label.ico"));
}
QString CustomLabelPlugin::toolTip() const
{
return QLatin1String("CustomLabel");
}
QString CustomLabelPlugin::whatsThis() const
{
return QLatin1String("This is a custom QLabel...");
}
bool CustomLabelPlugin::isContainer() const
{
return false;
}
QString CustomLabelPlugin::domXml() const
{
return QLatin1String("<widget class=\"ATRWidgets\" name=\"CustomLabel\">\n</widget>\n");
}
QString CustomLabelPlugin::includeFile() const
{
return QLatin1String("CustomLabel.h");
}
#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(CustomLabelPlugin, CustomLabelPlugin)
#endif // QT_VERSION < 0x050000
CustomLabel.json
{
"Name" : "CustomLabel",
"Version" : "1.0.0",
"CompatVersion" : "1.0.0",
"Vendor" : "Asiel Torres",
"Copyright" : "(C) Asiel Torres",
"License" : "Evaluation license.",
"Category" : "Qt Creator",
"Description" : "This plugin presents a custom QLabel.",
"Url" : ""
}
在做一些测试时,我发现 Qt 中有奇怪的工作方式。例如,如果我将插件从 designer 文件夹移动到 imageformats 文件夹,那么 Qt 会检测到插件,然后插件的信息会出现在 Qt 调试中。根据 Qt 文档,插件放置在 Qt 搜索加载插件的任何文件夹中。那么为什么信息出现在一个插件文件夹的调试中而不是另一个?不管怎样,插件的信息显示在调试中,但 Qt 不加载它。这是我从 Qt 调试信息中得到的:
QFactoryLoader::QFactoryLoader() checking directory path "/home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats" ...
QFactoryLoader::QFactoryLoader() looking at "/home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats/libCustomLabel.so"
Found metadata in lib /home/ragnarok/Qt5/5.15.0/gcc_64/plugins/imageformats/libCustomLabel.so, metadata=
{
"IID": "org.qt-project.Qt.QDesignerCustomWidgetInterface",
"archreq": 0,
"className": "CustomLabelPlugin",
"debug": false,
"version": 331520
}
Got keys from plugin meta data ()
经过更多研究后,我找到了解决方案并解决了问题。似乎 Designer 的插件必须放在 QT_INSTALL_PATH/Tools/QtCreator/lib/Qt/plugins/designer/ 文件夹中,而不是 $$[QT_INSTALL_PLUGINS]/designer 就像 Qt 的向导一样。作为 QT_INSTALL_PATH 安装 Qt 的文件夹。为了确认 Qt 加载了插件,我们最常在 Qt 中打开一个表单编辑器然后转到 Tools/Form Editor/About Qt Designer Plugins... 注意我们必须有在设计器中打开一个表单,以便此菜单起作用。此菜单将显示所有已加载的插件,并允许我们刷新插件,以防我们想要动态加载新插件。