このページでは

カスタムウィジェット拡張機能の作成

Qt Widgets Designer 用のカスタムウィジェットプラグインを作成したら、カスタムウィジェット拡張機能を使用して、Qt Widgets Designer'のワークスペース内で期待される動作と機能を提供できます。

拡張機能のタイプ

Qt Widgets Designer には、利用可能なエクステンションのタイプがいくつかあります。 それぞれのエクステンションのベースクラスを置き換えるだけで、同じパターンですべてのエクステンションを使用できます。

QDesignerContainerExtension は、カスタムマルチページコンテナを実装するときに必要です。

デザイナー・エディター・キャンバスのスクリーンショット。シンプルなカスタムウィジェットが表示され、コンテキストメニューが開き、"Edit State "オプションがハイライトされている。QDesignerTaskMenuExtension

QDesignerTaskMenuExtension はカスタムウィジェットに便利です。Qt Widgets Designer のタスクメニューにカスタムメニューエントリを追加できる拡張機能を提供します。

タスクメニュー拡張の例で、このクラスの使い方を説明します。

コンテナと開いているコンテキストメニューを示すデザイナーエディターのスクリーンショットQDesignerContainerExtension

QDesignerContainerExtension は、カスタムマルチページコンテナを実装するときに必要です。Qt Widgets Designer のマルチページコンテナプラグインのページの追加と削除を可能にする拡張機能を提供します。

Container Extension の例で、このクラスの使い方をさらに説明します。

注意: いくつかのウィジェット (QTabWidget など) では、実装方法の都合上、ページごとのカスタムプロパティを追加することはできません。

接続されたウィジェットが互いにどの機能を送信するかを示す "Configure Connecttion "のスクリーンショットQDesignerMemberSheetExtension

QDesignerMemberSheetExtension クラスを使用すると、シグナルとスロットの接続時に表示されるウィジェットのメンバ関数を操作できます。

プロパティ・エディター」のスクリーンショット。QDesignerPropertySheetExtension,QDesignerDynamicPropertySheetExtension

これらの拡張クラスを使用すると、ウィジェットのプロパティがQt Widgets Designer のプロパティ・エディタでどのように表示されるかを制御できます。

Qt Widgets Designer は、QDesignerPropertySheetExtensionQDesignerMemberSheetExtension クラスを使用して、プロパティとシグナルとスロットのエディタをフィードします。ワークスペースでウィジェットが選択されると、Qt Widgets Designer はそのウィジェットのプロパティ・シート拡張を問い合わせます。同様に、2 つのウィジェット間の接続が要求されると、Qt Widgets Designer はそのウィジェットのメンバ・シート拡張を問い合わせます。

警告 すべてのウィジェットには、デフォルトのプロパティ・シートとメンバ・シートがあります。カスタムのプロパティ・シートまたはメンバ・シート拡張機能を実装する場合、カスタムの拡張機能はデフォルトのシートを上書きします。

エクステンションの作成

エクステンションを作成するには、QObject と適切な基底クラスの両方を継承し、その関数を再実装する必要があります。インターフェイスを実装しているので、拡張クラスの定義にあるQ_INTERFACES() マクロを使用して、メタオブジェクトシステムにそれが通知されるようにしなければなりません。例えば

class MyExtension: public QObject,
                   public QdesignerContainerExtension
{
    Q_OBJECT
    Q_INTERFACE(QDesignerContainerExtension)

    ...
}

これにより、Qt Widgets Designerqobject_cast() 関数を使用して、QObject ポインタのみを使用してサポートされているインターフェイスを問い合わせることができます。

拡張機能の公開Qt Widgets Designer

Qt Widgets Designer では、拡張機能は必要になるまで作成されません。このため、拡張機能を実装する場合は、QExtensionFactory をサブクラス化して、拡張機能のインスタンスを作成できるクラスを作成する必要があります。また、Qt Widgets Designer のエクステンションマネージャーにファクトリーを登録しなければなりません。エクステンションマネージャーはエクステンションの構築を処理します。

拡張機能が要求されると、Qt Widgets Designer'の拡張機能マネージャは、選択されたウィジェットに対して要求された拡張機能を作成できるファクトリを見つけるまで、登録されたファクトリに対してQExtensionFactory::createExtension() を呼び出します。このファクトリーは拡張機能のインスタンスを作成します。

Qt Widgets Designer コンポーネント間の関係を示す図

拡張機能ファクトリの作成

QExtensionFactory クラスは標準エクステンションファクトリーを提供しますが、カスタムエクステンションファクトリーのインターフェースとしても使用できます。

その目的は、QExtensionFactory::createExtension() 関数を再実装して、MultiPageWidgetコンテナ拡張機能のような拡張機能を作成できるようにすることです。

新しいQExtensionFactory を作成し、QExtensionFactory::createExtension() 関数を再実装することができます:

QObject *ANewExtensionFactory::createExtension(QObject *object,
        const QString &iid, QObject *parent) const
{
    if (iid != Q_TYPEID(QDesignerContainerExtension))
        return 0;

    if (MyCustomWidget *widget = qobject_cast<MyCustomWidget*>
            (object))
        return new MyContainerExtension(widget, parent);

    return 0;
}

または、既存のファクトリーを使用し、QExtensionFactory::createExtension() 関数を拡張して、ファクトリーでカスタム拡張機能を作成できるようにすることもできます:

QObject *AGeneralExtensionFactory::createExtension(QObject *object,
        const QString &iid, QObject *parent) const
{
    MyCustomWidget *widget = qobject_cast<MyCustomWidget*>(object);

    if (widget && (iid == Q_TYPEID(QDesignerTaskMenuExtension))) {
         return new MyTaskMenuExtension(widget, parent);

    } else if (widget && (iid == Q_TYPEID(QDesignerContainerExtension))) {
        return new MyContainerExtension(widget, parent);

    } else {
        return 0;
    }
}

Qt Widgets Designer の拡張機能マネージャにアクセスする

カスタムウィジェットプラグインを実装する場合、Qt Widgets Designer にプラグインを公開するために、QDesignerCustomWidgetInterface をサブクラス化する必要があります。これについては、 Qt Widgets Designer のカスタムウィジェットを作成するセクションで詳しく説明します。拡張ファクトリの登録は、通常QDesignerCustomWidgetInterface::initialize() 関数で行います:

void MyPlugin::initialize(QDesignerFormEditorInterface *formEditor)
{
    if (initialized)
        return;

    QExtensionManager *manager = formEditor->extensionManager();
    Q_ASSERT(manager != 0);

    manager->registerExtensions(new MyExtensionFactory(manager),
                                Q_TYPEID(QDesignerTaskMenuExtension));

    initialized = true;
}

QDesignerCustomWidgetInterface::initialize() 関数のformEditor パラメータは、Qt Widgets Designer の現在のQDesignerFormEditorInterface オブジェクトへのポインタです。QDesignerFormEditorInterface::extensionManager ()関数を使用して、Qt Widgets Designer'の拡張マネージャーへのインターフェイスを取得する必要があります。次に、QExtensionManager::registerExtensions() 関数を使用して、カスタム拡張ファクトリを登録します。

Qt Widgets Designer でカスタムウィジェット拡張を作成する詳細については、タスクメニュー拡張と コンテナ拡張の例を参照してください。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.