コンテナ拡張の例
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.
Container Extensionの例は、4つのクラスで構成されています:
MultiPageWidget
はカスタムコンテナウィジェットで、ユーザがページを操作して入力し、コンボボックスを使ってページ間をナビゲートします。MultiPageWidgetPlugin
MultiPageWidget
クラスを Designer に公開します。Qt WidgetsMultiPageWidgetExtensionFactory
MultiPageWidgetContainerExtension
オブジェクトを作成します。MultiPageWidgetContainerExtension
コンテナ拡張機能を提供します。
カスタム ウィジェット プラグインのプロジェクト ファイルには、Qt Widgets Designer 内で確実に動作するための追加情報が必要です。たとえば、カスタム ウィジェット プラグインはQt Widgets Designer で提供されるコンポーネントに依存するため、使用するプロジェクト ファイルで指定する必要があります。まず、プラグインのプロジェクト ファイルを確認します。
次に、MultiPageWidgetPlugin
クラスを確認し、MultiPageWidgetExtensionFactory
とMultiPageWidgetContainerExtension
クラスを確認します。最後に、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
はinitialize() 関数も定義しており、プラグインがQt Widgets Designer にロードされた後に呼び出されます。この関数のQDesignerFormEditorInterface パラメータは、Qt Widgets Designer のすべての API へのゲートウェイをプラグインに提供します。
私たちのようなマルチページウィジェットの場合、2つのプライベートスロット、currentIndexChanged() および pageTitleChanged() を実装して、ユーザーが別のページを表示したり、ページタイトルを変更したりするたびにQt Widgets Designer のプロパティエディタを更新できるようにする必要があります。各ページに独自のタイトルを与えることができるように、QWidget::windowTitle プロパティを使用してページタイトルを格納することにしました(詳細については、containerextension/multipagewidget.cppのMultiPageWidgetクラスの実装を参照してください)。現在のところ、プレースホルダとして定義済みプロパティを使用することなく、ページにカスタムプロパティ(例えば、ページタイトル)を追加する方法はないことに注意してください。
MultiPageWidgetPlugin
クラスはQObject とQDesignerCustomWidgetInterface の両方を継承します。多重継承を使用する場合、すべてのインターフェイス(つまりQ_OBJECT を継承しないクラス)がQ_INTERFACES() マクロを使用してメタオブジェクトシステムに知らされるようにすることが重要です。これにより、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 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
オブジェクトの2 つの引数を取るコンストラクタを実装することにも注意してください。
QDesignerContainerExtension は、デフォルトで Designer のタスクメニューにいくつかのメニューエントリを提供し、ユーザが Designer のワークスペース内の関連するカスタムマルチページウィジェットにページを追加または削除できるようにします。Qt Widgets Qt Widgets
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 ウィジェットがQWidget およびQObject から継承するプロパティと同じ方法で管理できるようになります。
pageTitle
プロパティの宣言におけるSTORED
属性に注意してください:STORED
属性は、永続性を示します。つまり、オブジェクトの状態を保存するときに、プロパティの値を覚えておく必要があるかどうかを宣言します。上述したように、各ページに独自のタイトルを与えることができるように、QWidget::windowTitle プロパティを使用してページタイトルを保存することにしました。そのため、pageTitle
プロパティは編集目的で提供される「偽」のプロパティであり、保存する必要はありません。
また、Qt Widgets Designerのプロパティエディタが、ユーザーが別のページを表示したり、ページタイトルの1つを変更したりするたびに更新されるように、currentIndexChanged()シグナルとpageTitleChanged()シグナルを実装して発行する必要があります。
詳細については、containerextension/multipagewidget.cppの MultiPageWidget クラスの実装を参照してください。
© 2025 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.