コンテナ拡張の例

Qt Widgets Designer 用のカスタムマルチページプラグインの作成

Container Extension の例では、QDesignerContainerExtension クラスを使用して Qt Widgets Designer 用のカスタム・マルチページ・プラグインを作成する方法を示します。

Qt Widgets Designerで使用できるカスタムウィジェットを提供するには、自己完結型の実装を提供する必要があります。この例では、コンテナ拡張機能を表示するように設計されたカスタムマルチページウィジェットを使用します。

拡張機能とは、Qt Widgets Designerの動作を変更するオブジェクトです。QDesignerContainerExtension を使用すると、Qt Widgets Designer でカスタムマルチページウィジェットを管理および操作できるようになります。

Qt Widgets Designerには4種類の拡張機能があります:

  • QDesignerMemberSheetExtension Qt Widgets Designerのシグナルとスロットの編集モードを使用して接続を設定するときに表示されるウィジェットのメンバ関数を操作できる拡張機能。
  • QDesignerPropertySheetExtension Qt Widgets Designer のプロパティエディタに表示されるウィジェットのプロパティを操作できる拡張機能を提供します。
  • QDesignerTaskMenuExtension Qt Widgets Designer のタスクメニューにカスタムメニューエントリを追加する拡張機能を提供します。
  • QDesignerContainerExtension Qt Widgets Designer のマルチページコンテナプラグインにページを追加 (および削除) できる拡張機能。

この例と同じパターンに従って、それぞれの拡張機能ベースクラスを置き換えるだけで、すべての拡張機能を使用できます。詳細については、Qt Widgets Designer C++ Classes を参照してください。

コンテナ拡張の例は、4つのクラスで構成されています:

  • MultiPageWidget はカスタムコンテナウィジェットで、ユーザがページを操作して入力し、コンボボックスを使ってページ間をナビゲートします。
  • MultiPageWidgetPlugin MultiPageWidget クラスを Qt Widgets Designer に公開しています。
  • MultiPageWidgetExtensionFactory MultiPageWidgetContainerExtension オブジェクトを作成します。
  • MultiPageWidgetContainerExtension コンテナ拡張機能を提供します。

カスタムウィジェットプラグインのプロジェクトファイルには、Qt Widgets Designer内で確実に動作するための追加情報が必要です。例えば、カスタムウィジェットプラグインはQt Widgets Designerで提供されるコンポーネントに依存しており、使用するプロジェクトファイルでこれを指定する必要があります。まず、プラグインのプロジェクトファイルを見てみましょう。

次に、MultiPageWidgetPlugin クラスを確認し、MultiPageWidgetExtensionFactoryMultiPageWidgetContainerExtension クラスを見ていきます。最後に、MultiPageWidget クラスの定義を簡単に見ていきます。

プロジェクトファイル

CMake

プロジェクトファイルには、Qt Widgets Designer ライブラリにリンクするプラグインをビルドすることを記述する必要があります:

find_package(Qt6 REQUIRED COMPONENTS Core Designer Gui Widgets)

qt_add_plugin(containerextension)

target_link_libraries(containerextension PUBLIC
    Qt::Core
    Qt::Designer
    Qt::Gui
    Qt::Widgets
)

次の例では、ウィジェットのヘッダーファイルとソースファイルを追加する方法を示します:

target_sources(containerextension PRIVATE
    multipagewidget.cpp multipagewidget.h
    multipagewidgetcontainerextension.cpp multipagewidgetcontainerextension.h
    multipagewidgetextensionfactory.cpp multipagewidgetextensionfactory.h
    multipagewidgetplugin.cpp multipagewidgetplugin.h
)

Qt Widgets Designerがカスタムウィジェットを使用できるように、プラグイン・インターフェースの実装を提供します。この例では、コンテナ拡張インターフェースと拡張ファクトリの実装も提供します。

Qt Widgets Designerが検索できる場所にプラグインをインストールすることが重要です。プロジェクトのターゲットパスを指定し、インストールするアイテムのリストに追加します:

   set(INSTALL_EXAMPLEDIR "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/designer")
install(TARGETS containerextension
    RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
    BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
    LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)

コンテナ拡張機能はライブラリとして作成されます。コンテナ拡張機能はライブラリとして作成され、プロジェクトのインストール時に他の Qt Widgets Designer プラグインと一緒にインストールされます(ninja install または同等のインストール手順を使用)。

プラグインの詳細については、How to Create Qt Pluginsドキュメントを参照してください。

qmake

次の例は、プラグインを Qt Widgets Designer ライブラリにリンクする方法を示しています:

TEMPLATE = lib
CONFIG  += plugin

QT      += widgets designer

次の例では、ウィジェットのヘッダーファイルとソースファイルを追加する方法を示します:

HEADERS += multipagewidget.h \
           multipagewidgetplugin.h \
           multipagewidgetcontainerextension.h \
           multipagewidgetextensionfactory.h

SOURCES += multipagewidget.cpp \
           multipagewidgetplugin.cpp \
           multipagewidgetcontainerextension.cpp \
           multipagewidgetextensionfactory.cpp

OTHER_FILES += multipagewidget.json

次の例は、Qt Widgets Designerのプラグインパスにプラグインをインストールする方法を示しています:

target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += target

MultiPageWidgetPlugin クラス定義

MultiPageWidgetPlugin クラスは、MultiPageWidget クラスを Qt Widgets Designer に公開します。その定義は、詳細に説明されているCustom Widget Pluginの例のプラグインクラスに似ています。この特定のカスタムウィジェットに固有のクラス定義の部分は、クラス名といくつかのプライベートスロットです:

#ifndef MULTIPAGEWIDGETPLUGIN_H
#define MULTIPAGEWIDGETPLUGIN_H

#include <QtUiPlugin/QDesignerCustomWidgetInterface>

class QIcon;
class QWidget;

class MultiPageWidgetPlugin: public QObject, public QDesignerCustomWidgetInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidget")
    Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
    explicit MultiPageWidgetPlugin(QObject *parent = nullptr);

    QString name() const override;
    QString group() const override;
    QString toolTip() const override;
    QString whatsThis() const override;
    QString includeFile() const override;
    QIcon icon() const override;
    bool isContainer() const override;
    QWidget *createWidget(QWidget *parent) override;
    bool isInitialized() const override;
    void initialize(QDesignerFormEditorInterface *formEditor) override;
    QString domXml() const override;

private slots:
    void currentIndexChanged(int index);
    void pageTitleChanged(const QString &title);

private:
    bool initialized = false;
};

#endif

プラグインクラスは、クラス名やインクルードファイルなど、プラグインに関する基本情報をQt Widgets Designerに提供します。さらに、MultiPageWidget ウィジェットのインスタンスを作成する方法も知っています。MultiPageWidgetPlugin は、プラグインが Qt Widgets Designer にロードされた後に呼び出されるinitialize() 関数も定義しています。この関数のQDesignerFormEditorInterface パラメータは、Qt Widgets Designer のすべての API へのゲートウェイをプラグインに提供します。

私たちのようなマルチページ・ウィジェットの場合、2つのプライベート・スロット、currentIndexChanged()とpageTitleChanged()を実装し、ユーザーが別のページを表示したり、ページ・タイトルの1つを変更したりするたびに、Qt Widgets Designerのプロパティ・エディタを更新できるようにする必要があります。各ページに独自のタイトルを与えることができるように、QWidget::windowTitle プロパティを使用してページタイトルを保存することにしました(詳細については、containerextension/multipagewidget.cppのMultiPageWidgetクラスの実装を参照してください)。現在のところ、プレースホルダとして定義済みプロパティを使用することなく、ページにカスタムプロパティ(例えば、ページタイトル)を追加する方法はないことに注意してください。

MultiPageWidgetPlugin クラスは、QObjectQDesignerCustomWidgetInterface の両方を継承します。多重継承を使用する場合、Q_INTERFACES() マクロを使用して、すべてのインターフェイス(つまり、Q_OBJECT を継承しないクラス)がメタオブジェクトシステムに知らされるようにすることが重要です。これにより、Qt Widgets Designerは、qobject_cast()を使用して、QObject ポインタだけを使用して、サポートされているインタフェースを問い合わせることができます。

Qt がウィジェットをプラグインとして認識するようにするには、Q_PLUGIN_METADATA() マクロを追加して、ウィジェットの関連情報をエクスポートします:

    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidget")

このマクロにより、Qt Widgets Designerはカスタムウィジェットにアクセスし、構築することができます。このマクロがないと、Qt Widgets Designerはウィジェットを使用できません。

MultiPageWidgetPlugin クラスの実装

MultiPageWidgetPluginクラスの実装は、ほとんどの部分でCustom Widget Pluginサンプルのプラグインクラスと同等です:

MultiPageWidgetPlugin::MultiPageWidgetPlugin(QObject *parent)
    : QObject(parent)
{
}

QString MultiPageWidgetPlugin::name() const
{
    return u"MultiPageWidget"_s;
}

QString MultiPageWidgetPlugin::group() const
{
    return u"Display Widgets [Examples]"_s;
}

QString MultiPageWidgetPlugin::toolTip() const
{
    return {};
}

QString MultiPageWidgetPlugin::whatsThis() const
{
    return {};
}

QString MultiPageWidgetPlugin::includeFile() const
{
    return u"multipagewidget.h"_s;
}

QIcon MultiPageWidgetPlugin::icon() const
{
    return {};
}

bool MultiPageWidgetPlugin::isInitialized() const
{
    return initialized;
}

異なる関数の1つはisContainer()関数で、この例ではカスタムウィジェットがコンテナとして使用されることを意図しているため、trueを返します。

bool MultiPageWidgetPlugin::isContainer() const
{
    return true;
}

異なるもう1つの関数は、カスタムウィジェットを作成する関数です:

QWidget *MultiPageWidgetPlugin::createWidget(QWidget *parent)
{
    auto *widget = new MultiPageWidget(parent);
    connect(widget, &MultiPageWidget::currentIndexChanged,
            this, &MultiPageWidgetPlugin::currentIndexChanged);
    connect(widget, &MultiPageWidget::pageTitleChanged,
            this, &MultiPageWidgetPlugin::pageTitleChanged);
    return widget;
}

ウィジェットを作成して返すだけでなく、カスタムコンテナウィジェットの currentIndexChanged() シグナルをプラグインの currentIndexChanged() スロットに接続して、ユーザが別のページを表示するたびに Qt Widgets Designer のプロパティエディタが更新されるようにしています。また、ウィジェットの pageTitleChanged() シグナルをプラグインの pageTitleChanged() スロットに接続します。

currentIndexChanged()スロットは、カスタムウィジェットのcurrentIndexChanged()シグナルが発信されるたびに、つまりユーザーが別のページを表示するたびに呼び出されます:

void MultiPageWidgetPlugin::currentIndexChanged(int index)
{
    Q_UNUSED(index);
    auto *widget = qobject_cast<MultiPageWidget*>(sender());

まず、QObject::sender() とqobject_cast() 関数を使用して、シグナルを発するオブジェクトを取得します。シグナルによってアクティブ化されたスロットで呼び出された場合、QObject::sender ()はシグナルを発信したオブジェクトへのポインタを返し、そうでない場合は0を返します。

    if (widget) {
        auto *form = QDesignerFormWindowInterface::findFormWindow(widget);
        if (form)
            form->emitSelectionChanged();
    }
}

ウィジェットを取得したら、プロパティ・エディタを更新できます。Qt Widgets Designerは、QDesignerPropertySheetExtension クラスを使用してプロパティ・エディタをフィードします。ワークスペースでウィジェットが選択されるたびに、Qt Widgets Designerはウィジェットのプロパティ・シート拡張子を照会し、プロパティ・エディタを更新します。

そこで、Qt Widgets Designerにウィジェットの内部選択が変更されたことを通知します:まず、staticQDesignerFormWindowInterface::findFormWindow() 関数を使用して、ウィジェットを含むQDesignerFormWindowInterface オブジェクトを取得します。QDesignerFormWindowInterface クラスを使用すると、Qt Widgets Designer のワークスペースに表示されるフォーム・ウィンドウを照会および操作できます。その後、emitSelectionChanged() シグナルを発信し、プロパティ・エディタを強制的に更新するだけです。

ページのタイトルを変更する場合、プロパティ・エディタの一般的な更新だけでは十分ではありません。そのため、タイトルを変更したいページのQDesignerPropertySheetExtension オブジェクトにアクセスする必要があります。QDesignerPropertySheetExtension クラスでもウィジェットのプロパティを操作できますが、拡張子を取得するには、まず Qt Widgets Designer の拡張子マネージャへのアクセスを取得する必要があります:

void MultiPageWidgetPlugin::pageTitleChanged(const QString &title)
{
    Q_UNUSED(title);
    auto *widget = qobject_cast<MultiPageWidget*>(sender());
    if (widget) {
        auto *page = widget->widget(widget->currentIndex());
        auto *form = QDesignerFormWindowInterface::findFormWindow(widget);

ここでもまず、QObject::sender() とqobject_cast() 関数を使用して、シグナルを発するウィジェットを取得します。次に、シグナルを発したウィジェットから現在のページを取得し、静的なQDesignerFormWindowInterface::findFormWindow() 関数を使用して、ウィジェットを含むフォームを取得します。

            auto *editor = form->core();
            auto *manager = editor->extensionManager();

これでフォーム・ウィンドウを取得したので、QDesignerFormWindowInterface クラスは、現在のQDesignerFormEditorInterface オブジェクトを返すcore() 関数を提供します。QDesignerFormEditorInterface クラスを使用すると、Qt Designer のさまざまなコンポーネントにアクセスできます。特に、QDesignerFormEditorInterface::extensionManager ()関数は現在の拡張機能マネージャへの参照を返します。

            auto *sheet = qt_extension<QDesignerPropertySheetExtension*>(manager, page);
            const int propertyIndex = sheet->indexOf(QLatin1String("windowTitle"));
            sheet->setChanged(propertyIndex, true);
        }
    }
}

拡張機能マネージャを取得したら、拡張機能シートを更新することができます:まず、qt_extension() 関数を使用して、タイトルを変更したいページのプロパティ拡張子を取得します。次に、QDesignerPropertySheetExtension::indexOf ()関数を使用して、ページタイトルのインデックスを取得します。前述したように、ページタイトルを格納するためにQWidget::windowTitle プロパティを使用することにしました(詳細については、containerextension/multipagewidget.cppのMultiPageWidgetクラスの実装を参照してください)。最後に、QDesignerPropertySheetExtension::setChanged()関数を呼び出すことで、ページのプロパティ・シートを暗黙的に強制更新します。

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

initialize()関数にも注意してください:initialize() 関数は引数としてQDesignerFormEditorInterface オブジェクトを取ります。

    auto *manager = formEditor->extensionManager();

カスタムウィジェットプラグインに関連する拡張機能を作成する場合、QDesignerFormEditorInterface パラメータから取得する Qt Widgets Designer の現在の拡張機能マネージャにアクセスする必要があります。

ウィジェットのプロパティを操作できるだけでなく、QExtensionManager クラスは Qt Widgets Designer の拡張機能管理機能を提供します。Qt Widgets Designerの現在の拡張機能マネージャを使用すると、指定したオブジェクトの拡張機能を取得できます。また、与えられたオブジェクトの拡張機能を登録したり解除したりすることもできます。拡張機能はQt Widgets Designerの動作を変更するオブジェクトです。

拡張機能を登録する場合、実際に登録されるのは関連する拡張機能ファクトリです。Qt Widgets Designerでは、拡張機能ファクトリは必要に応じて名前の付いた拡張機能を検索し、作成するために使用されます。したがって、この例では、関連するウィジェットがコンテナであるかどうかを Qt Widgets Designer が知る必要があるまで、コンテナ拡張機能自体は作成されません。

    auto *factory = new MultiPageWidgetExtensionFactory(manager);

    Q_ASSERT(manager != nullptr);
    manager->registerExtensions(factory, Q_TYPEID(QDesignerContainerExtension));

    initialized = true;
}

QDesignerFormEditorInterface パラメータから取得した Qt Widgets Designer の現在のextension manager を使用して登録するMultiPageWidgetExtensionFactory オブジェクトを作成します。第1引数は新しく作成されたファクトリで、第2引数は文字列である拡張識別子です。Q_TYPEID() マクロは単に文字列をQLatin1String に変換します。

MultiPageWidgetExtensionFactory クラスはQExtensionFactory のサブクラスです。Qt Widgets Designer は、ウィジェットがコンテナであるかどうかを知る必要がある場合、Qt Widgets Designer の拡張機能マネージャは、登録されているすべてのファクトリを実行し、そのウィジェットのコンテナ拡張機能を作成できる最初のファクトリを呼び出します。このファクトリーはMultiPageWidgetExtension オブジェクトを作成します。

QString MultiPageWidgetPlugin::domXml() const
{
    return uR"(
<ui language="c++">
    <widget class="MultiPageWidget" name="multipagewidget">
        <widget class="QWidget" name="page"/>
    </widget>
    <customwidgets>
        <customwidget>
            <class>MultiPageWidget</class>
            <extends>QWidget</extends>
            <addpagemethod>addPage</addpagemethod>
        </customwidget>
    </customwidgets>
</ui>)"_s;
}

最後に、domXml() 関数を見てください。この関数には、Qt Widgets Designer で使用される標準 XML フォーマットのウィジェットのデフォルト設定が含まれています。この場合、コンテナの最初のページを指定します。マルチページウィジェットの最初のページは、この関数内で指定する必要があります。

MultiPageWidgetExtensionFactory クラス定義

MultiPageWidgetExtensionFactory クラスは、Qt Widgets Designer の標準拡張ファクトリを提供するQExtensionFactory を継承します。

class MultiPageWidgetExtensionFactory: public QExtensionFactory
{
    Q_OBJECT

public:
    explicit MultiPageWidgetExtensionFactory(QExtensionManager *parent = nullptr);

protected:
    QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const override;
};

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

MultiPageWidgetExtensionFactory クラスの実装

クラスのコンストラクタは、QExtensionFactory ベースクラスのコンストラクタを呼び出すだけです:

MultiPageWidgetExtensionFactory::MultiPageWidgetExtensionFactory(QExtensionManager *parent)
    : QExtensionFactory(parent)
{}

上述したように、ファクトリは、関連付けられたウィジェットがコンテナであるかどうかを Qt Widgets Designer が知る必要があるときに呼び出されます。

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

    if (widget && (iid == Q_TYPEID(QDesignerContainerExtension)))
        return new MultiPageWidgetContainerExtension(widget, parent);
    return nullptr;
}

Qt Widgets Designerの動作は、要求された拡張機能がコンテナ、メンバーシート、プロパティシート、タスクメニューのいずれに関連付けられていても同じです:拡張機能マネージャは、要求された拡張機能を作成するまで、登録されているすべての拡張機能ファクトリからcreateExtension() を呼び出します。

そのため、MultiPageWidgetExtensionFactory::createExtension() で最初にすることは、拡張機能が要求されたQObject が、実際にMultiPageWidget オブジェクトであるかどうかをチェックすることである。次に、要求された拡張機能がコンテナ拡張機能かどうかをチェックする。

オブジェクトがコンテナ拡張を要求しているMultiPageWidgetの場合、MultiPageWidgetExtension オブジェクトを作成して返します。そうでない場合は、単に null ポインタを返し、Qt Widgets Designer の拡張機能マネージャが登録されたファクトリの検索を続行できるようにします。

MultiPageWidgetContainerExtension クラスの定義

MultiPageWidgetContainerExtension クラスはQDesignerContainerExtension を継承し、Qt Widgets Designer のマルチページコンテナプラグインにページを追加(および削除)できます。

class MultiPageWidgetContainerExtension: public QObject,
                                         public QDesignerContainerExtension
{
    Q_OBJECT
    Q_INTERFACES(QDesignerContainerExtension)

public:
    explicit MultiPageWidgetContainerExtension(MultiPageWidget *widget, QObject *parent);

    bool canAddWidget() const override;
    void addWidget(QWidget *widget) override;
    int count() const override;
    int currentIndex() const override;
    void insertWidget(int index, QWidget *widget) override;
    bool canRemove(int index) const override;
    void remove(int index) override;
    void setCurrentIndex(int index) override;
    QWidget *widget(int index) const override;

private:
    MultiPageWidget *myWidget;
};

QDesignerContainerExtension クラスは、Qt Widgets Designer にカスタムマルチページウィジェットの機能へのアクセスを提供することのみを目的としていることを認識することが重要です。カスタムマルチページウィジェットは、拡張機能の機能に対応する機能を実装する必要があります。

親ウィジェットとタスクメニューが要求されるMultiPageWidget オブジェクトです。

QDesignerContainerExtension は、デフォルトで Qt Widgets Designer のタスクメニューにいくつかのメニューエントリを提供し、ユーザが Qt Widgets Designer のワークスペース内の関連するカスタムマルチページウィジェットにページを追加または削除できるようにします。

MultiPageWidgetContainerExtension クラスの実装

コンストラクタでは、パラメータとして送られたMultiPageWidget オブジェクト、つまり拡張機能に関連付けられたウィジェットへの参照を保存します。これは後で、要求されたアクションを実行するカスタムマルチページウィジェットにアクセスするために必要になります。

MultiPageWidgetContainerExtension::MultiPageWidgetContainerExtension(MultiPageWidget *widget,
                                                                     QObject *parent)
    : QObject(parent)
    , myWidget(widget)
{
}

Qt Widgets Designerでカスタムマルチページウィジェットを完全に管理および操作できるようにするには、QDesignerContainerExtension のすべての関数を再実装する必要があります:

bool MultiPageWidgetContainerExtension::canAddWidget() const
{
    return true;
}

void MultiPageWidgetContainerExtension::addWidget(QWidget *widget)
{
    myWidget->addPage(widget);
}

int MultiPageWidgetContainerExtension::count() const
{
    return myWidget->count();
}

int MultiPageWidgetContainerExtension::currentIndex() const
{
    return myWidget->currentIndex();
}

canAddWidget() とaddWidget() を再実装し、コンテナに指定したページを追加し、count() でコンテナ内のページ数を返し、currentIndex() で現在選択されているページのインデックスを返す必要があります。

void MultiPageWidgetContainerExtension::insertWidget(int index, QWidget *widget)
{
    myWidget->insertPage(index, widget);
}

bool MultiPageWidgetContainerExtension::canRemove(int index) const
{
    Q_UNUSED(index);
    return true;
}

void MultiPageWidgetContainerExtension::remove(int index)
{
    myWidget->removePage(index);
}

void MultiPageWidgetContainerExtension::setCurrentIndex(int index)
{
    myWidget->setCurrentIndex(index);
}

QWidget* MultiPageWidgetContainerExtension::widget(int index) const
{
    return myWidget->widget(index);
}

また、insertWidget() 指定されたインデックスで指定されたページをコンテナに追加し、canRemove() とremove() 指定されたインデックスで指定されたページを削除し、setCurrentIndex() 現在選択されているページのインデックスを設定し、最後にwidget() 指定されたインデックスで指定されたページを返すことを再実装する必要があります。

MultiPageWidgetクラスの定義

MultiPageWidgetクラスは、カスタムコンテナウィジェットであり、ユーザがページを操作して入力し、コンボボックスを使ってページ間をナビゲートします。

class MultiPageWidget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex)
    Q_PROPERTY(QString pageTitle READ pageTitle WRITE setPageTitle STORED false)

public:
    explicit MultiPageWidget(QWidget *parent = nullptr);

    QSize sizeHint() const override;

    int count() const;
    int currentIndex() const;
    QWidget *widget(int index);
    QString pageTitle() const;

public slots:
    void addPage(QWidget *page);
    void insertPage(int index, QWidget *page);
    void removePage(int index);
    void setPageTitle(const QString &newTitle);
    void setCurrentIndex(int index);

private slots:
    void pageWindowTitleChanged();

signals:
    void currentIndexChanged(int index);
    void pageTitleChanged(const QString &title);

private:
    QStackedWidget *stackWidget;
    QComboBox *comboBox;
};

QDesignerContainerExtension クラスは Qt Designer がカスタムマルチページウィジェットの機能にアクセスできるようにするためのものなので、カスタムマルチページウィジェットはQDesignerContainerExtension のメンバ関数に対応する機能を実装する必要があります。

さらに、currentIndex およびpageTitle プロパティと、それらに関連する set および get 関数を宣言します。これらの属性をプロパティとして宣言することで、Qt Widgets Designerは、MultiPageWidgetウィジェットがQWidgetQObject から継承するプロパティ(例えば、プロパティ・エディタの機能)を管理するのと同じ方法で、これらの属性を管理することができます。

pageTitle プロパティの宣言におけるSTORED 属性に注意してください:STORED 属性は、永続性を示します。つまり、オブジェクトの状態を保存するときに、プロパティの値を覚えておく必要があるかどうかを宣言します。上述したように、各ページに独自のタイトルを与えることができるように、QWidget::windowTitle プロパティを使用してページタイトルを保存することにしました。そのため、pageTitle プロパティは編集目的で提供される「偽」のプロパティであり、保存する必要はありません。

また、ユーザが別のページを表示したり、ページタイトルの1つを変更したりするたびに、Qt Widgets Designerのプロパティエディタが更新されるように、currentIndexChanged()シグナルとpageTitleChanged()シグナルを実装して発行する必要があります。

詳細はcontainerextension/multipagewidget.cppのMultiPageWidgetクラスの実装を参照してください。

サンプルプロジェクト @ code.qt.io

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