2017-10-02 1 views
0

TL; DRなし関連するウィジェットプラグインでのQt Designerで拡張子を登録する

私はQtのデザイナー拡張子を登録したいが、どのウィジェットプラグインを必要としないので、次のいずれかの私の問題を解決することができます。

  • は、どのように私はウィジェットボックス内の任意のウィジェットを公開しないのQt Designerでプラグインを作成するのですが、それは拡張子を登録することができますか?
  • QDesignerCustomWidgetInterfaceのサブクラス化せずにエクステンションを登録するにはどうすればよいですか?

私はQtのデザイナーのためのプラグインのセットに取り組んでいます。これらのプラグインはカスタムウィジェットをデザイナーに公開します。

CCommonWidget 
|-> CLabel 
|-> CPushButton 
... 

CCommonWidgetは、すべてのウィジェットのためのいくつかの共通プロパティを定義する:すべてのウィジェット(数十)のような、一般的なクラス(CCommonWidget)から継承します。拡張子(例えば、QDesignerTaskMenuExtension)を使ってQt Designerに公開したいと思います。

私はCLabelプラグインでテストを開始しました。ここでは、2つの関連するメソッド:

// Register the extensions in Qt Designer 
void CLabelPlugin::initialize(QDesignerFormEditorInterface *formEditor) 
{ 
    if (m_initialized) return; 

    auto extensionManager = formEditor->extensionManager(); 
    Q_ASSERT(extensionManager); 

    extensionManager->registerExtensions(new CLabelPluginFactory(extensionManager), Q_TYPEID(QDesignerTaskMenuExtension)); 

    m_initialized = true; 
} 

// The factory creates the menu extension if the widget is a CLabel 
QObject* CLabelPluginFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const 
{ 
    if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) return nullptr; 

    if (auto label = dynamic_cast<CLabel*>(object)) 
     return new CLabelPluginMenu(label, parent); 

    return nullptr; 
} 

それは完璧に働いたと私はプラグインの残りの部分にアイデアを拡張しようとしていました。コードをコピー/ペーストするのではなく、CCommonPluginで始まり、すべての人にそれを継承させるようにしました。可能な限り再利用可能なようにそれを作るために、私は変更createExtension方法:私はプラグインを(CLabelPlugin)が拡張工場、CCommonWidgetから継承する他のウィジェットを登録した場合でもことを理解ここ

QObject* CCommonPluginFactory::createExtension(QObject *object, const QString &iid, QObject *parent) const 
{ 
    if (iid != Q_TYPEID(QDesignerTaskMenuExtension)) return nullptr; 

    if (auto label = dynamic_cast<CCommonWidget*>(object)) 
     return new CCommnPluginMenu(label, parent); 

    return nullptr; 
} 

メニューが表示されます! (私がそれを発見するとかなり明白でしたが、私はそれについて考えなかった)。

今では、私はすべてのプラグイン(何十)を変更することがなかったが、ちょうど新しい1、拡張工場を登録するダミー共通のプラグインを作成するので、簡単でした。

私が最初に作成したダミープラグイン:

class CPluginCommon : public QObject, public QDesignerCustomWidgetInterface { 
    Q_OBJECT 
    Q_INTERFACES(QDesignerCustomWidgetInterface) 

public: 
    explicit CPluginCommon(QObject* parent=0); 

public: // QDesignerCustomWidgetInterface 
    QWidget* createWidget(QWidget* parent) { return nullptr; } 
    QString group() const { return QString(); } 
    QIcon icon() const { return QIcon(); } 
    QString includeFile() const { return QString(); } 
    bool isContainer() const { return false; } 
    QString name() const { return QString(); } 
    QString toolTip() const { return QString(); } 
    QString whatsThis() const { return QString(); } 

    virtual bool isInitialized() const override { 
     return m_initialized; 
    } 
    virtual void initialize(QDesignerFormEditorInterface *formEditor) override; 

private: 
    bool m_initialized; 
}; 

をしかし、空白のウィジェットはQtのデザイナーのウィジェットボックスに表示されます。私は空のウィジェットを望んでいない、私は望むウィジェットなし

別のオプションは、プラグインのこれらの種類を使用することはありませんが、私はQDesignerCustomWidgetInterfaceない延長を登録する方法を見つけるのに苦労していますが、私は見つけることができるすべてはQDesignerCustomWidgetInterface::initialize(QDesignerFormEditorInterface *formEditor)内の拡張機能マネージャを取得することです(formEditor->extensionManager()を使用して)。

答えて

2

クイック答え

だけで(これは文書化されていない機能です)、空のXMLを返すウィジェットボックスからウィジェットを非表示にするには:

class CPluginCommon : public QObject, public QDesignerCustomWidgetInterface { 
// ... 
public: 
    QString domXml() const { return QString(); } 
}; 

プラグインマネージャのコードの確認Qt DesignerのQDesignerPluginManagerPrivate::addCustomWidgetメソッドでは、次のようになりました(cQDesignerCustomWidgetInterfaceへのポインタ)

ソースコード内に限り、私が見てきたように、完全性のために

virtual QString domXml() const 
{ 
    return QString::fromUtf8("<widget class=\"%1\" name=\"%2\"/>") 
     .arg(name()).arg(name().toLower()); 
} 

const QString domXml = c->domXml(); 
if (!domXml.isEmpty()) { // Legacy: Empty XML means: Do not show up in widget box. 
私は domXmlのデフォルトの実装では、一般的なウィジェットの小さなXMLフラグメントを返さないことを見た、ということを考えると

// Load plugins into widget database and factory. 
void QDesignerIntegration::initializePlugins(QDesignerFormEditorInterface *formEditor) 
{ 
    // load the plugins 
    WidgetDataBase *widgetDataBase = qobject_cast<WidgetDataBase*>(formEditor->widgetDataBase()); 
    if (widgetDataBase) { 
     widgetDataBase->loadPlugins(); 
    } 

    if (WidgetFactory *widgetFactory = qobject_cast<WidgetFactory*>(formEditor->widgetFactory())) { 
     widgetFactory->loadPlugins(); 
    } 

    if (widgetDataBase) { 
     widgetDataBase->grabDefaultPropertyValues(); 
    } 
} 

01:Qtのデザイナーのプラグインマネージャの、QDesignerCustomWidgetInterfaceから継承されていないプラグインをロードする方法はありません

void WidgetDataBase::loadPlugins() 
{ 
    // ... 

    // 2) create a list plugins 
    ItemList pluginList; 
    const QDesignerPluginManager *pm = m_core->pluginManager(); 
    foreach(QDesignerCustomWidgetInterface* c, pm->registeredCustomWidgets()) 
     pluginList += createCustomWidgetItem(c, pm->customWidgetData(c)); 

    // ... 
} 

void WidgetFactory::loadPlugins() 
{ 
    m_customFactory.clear(); 

    QDesignerPluginManager *pluginManager = m_core->pluginManager(); 

    QList<QDesignerCustomWidgetInterface*> lst = pluginManager->registeredCustomWidgets(); 
    foreach (QDesignerCustomWidgetInterface *c, lst) { 
     m_customFactory.insert(c->name(), c); 
    } 
} 
関連する問題