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

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

拡張機能の種類

Qt Widgets Designerで使用可能な拡張機能にはいくつかの種類があります。これらの拡張機能はすべて同じパターンで使用でき、それぞれの拡張機能ベースクラスを置き換えるだけです。

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

QDesignerTaskMenuExtension

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

Task Menu Extension の例では、このクラスの使用方法を説明しています。

QDesignerContainerExtension

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

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

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

QDesignerMemberSheetExtension

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

QDesignerPropertySheetExtension,QDesignerDynamicPropertySheetExtension

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

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

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

エクステンションの作成

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

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

    ...
}

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

Qt Widgets Designerへの拡張機能の公開

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

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

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

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のExtension Managerへのアクセス

カスタムウィジェットプラグインを実装する場合、QDesignerCustomWidgetInterface をサブクラス化してプラグインを Qt Widgets Designer に公開する必要があります。これについては、「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でカスタムウィジェット拡張機能を作成する詳細については、タスクメニュー拡張機能およびコンテナ拡張機能の例を参照してください。

©2024 The Qt Company Ltd. ここに含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。