如何为Qt Designer集成自定义小部件插件

问题描述

我使用Qt的向导制作了一个Qt Custom Designer Widget。该插件可以编译并安装在Qt Designer的plugin文件夹中,不会出现问题,但不会显示在“关于Qt的插件”中。我使用 QT_DEBUG_PLUGINS 并注意到该插件未出现在调试信息中。但是,当我编译另一个SIGBUILD插件(它不是Qt Designer的小部件)时,它似乎已加载。我不知道为了集成这些插件我在做什么错。这是我用来制作插件代码示例。有谁知道如何解决这个问题?

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中打开一个表单编辑器,请转至工具/表单编辑器/关于Qt Designer插件... 。请注意,我们必须在Designer中打开一个表单为了使此菜单正常工作。此菜单将显示所有已加载的插件,并允许我们刷新这些插件,以防我们要动态加载新插件。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...