タスクメニュー拡張機能
Qt Widgets Designer 用のカスタムウィジェットプラグインを作成し、そのプラグインに関連付けられたカスタムタスクメニュー項目を提供する方法について説明します。
「タスクメニュー拡張機能」のサンプルでは、 Qt Widgets Designer、およびQDesignerTaskMenuExtension クラスを使用して、そのプラグインに関連付けられたカスタムタスクメニュー項目を提供する方法を示しています。
Qt Widgets Designer のコンテキストメニューにある、カスタム「状態の編集...」アクションのスクリーンショット。" src="images/taskmenuextension-example.webp" title="Qt Widgets Designer のコンテキストメニューにある、カスタム「状態の編集...」アクションのスクリーンショット。"/>
Qt Widgets Designer で使用できるカスタムウィジェットを提供するには、自己完結型の実装を用意する必要があります。この例では、タスクメニュー拡張機能を表示するように設計されたカスタムウィジェット、TicTacToe ウィジェットを使用します。
拡張機能とは、Qt Widgets Designer の動作を変更するオブジェクトのことです。QDesignerTaskMenuExtension は、この拡張機能を備えたウィジェットが選択された際に、カスタムのタスクメニュー項目を提供することができます。
Qt Widgets Designer では、4 種類の拡張機能が利用可能です:
- QDesignerContainerExtension Qt Widgets Designer のマルチページコンテナプラグインにページを追加(および削除)できる拡張機能を提供します。
- QDesignerMemberSheetExtension Qt Widgets Designer のシグナルおよびスロット編集モードを使用して接続を設定する際に表示されるウィジェットのメンバ関数を操作できる拡張機能を提供します。
- QDesignerPropertySheetExtension Qt Widgets Designer のプロパティエディタに表示されるウィジェットのプロパティを操作できる拡張機能を提供します。
- QDesignerTaskMenuExtension Qt Widgets Designer のタスクメニューにカスタムメニュー項目を追加できる拡張機能を提供します。
この例と同じパターンに従って、それぞれの拡張ベースクラスを置き換えるだけで、すべての拡張機能を使用できます。詳細については、 Qt Widgets Designer C++ Classesを参照してください。
「タスクメニュー拡張機能」の例は、5つのクラスで構成されています。
TicTacToeは、ユーザーが三目並べ(Tic-Tac-Toe)ゲームをプレイできるようにするカスタムウィジェットです。TicTacToePluginは、TicTacToeクラスをQt Widgets Designer に公開します。TicTacToeTaskMenuFactoryは、TicTacToeTaskMenuオブジェクトを作成します。TicTacToeTaskMenuタスクメニュー拡張機能、すなわちプラグインに関連付けられたタスクメニュー項目を提供します。TicTacToeDialogユーザーがQt Widgets Designer に読み込まれた三目並べプラグインの状態を変更できるようにします。
カスタムウィジェットプラグインのプロジェクトファイルには、Qt Widgets Designer 内で確実に動作させるために、いくつかの追加情報が必要です。たとえば、カスタムウィジェットプラグインはQt Widgets Designer に付属のコンポーネントに依存しているため、使用するプロジェクトファイルでこれを指定する必要があります。まず、プラグインのプロジェクトファイルについて見ていきましょう。
次に、TicTacToePlugin クラスを確認し、TicTacToeTaskMenuFactory およびTicTacToeTaskMenu クラスについて見ていきます。最後に、TicTacToeDialog クラスを確認した後、TicTacToe ウィジェットのクラス定義を簡単に見ていきます。
プロジェクトファイル
CMake
プロジェクトファイルでは、Qt Widgets Designer ライブラリにリンクするプラグインをビルドすることを明記する必要があります:
find_package(Qt6 REQUIRED COMPONENTS Core Designer Gui Widgets)
qt_add_plugin(taskmenuextension)
target_link_libraries(taskmenuextension PUBLIC
Qt::Core
Qt::Designer
Qt::Gui
Qt::Widgets
)以下の例は、ウィジェットのヘッダーファイルとソースファイルを追加する方法を示しています:
target_sources(taskmenuextension PRIVATE
tictactoe.cpp tictactoe.h
tictactoedialog.cpp tictactoedialog.h
tictactoeplugin.cpp tictactoeplugin.h
tictactoetaskmenu.cpp tictactoetaskmenu.h
)Qt Widgets Designer がカスタムウィジェットを使用できるように、プラグインインターフェースの実装を提供します。この具体的な例では、タスクメニュー拡張機能と拡張機能ファクトリの実装に加え、ダイアログの実装も提供しています。
プラグインがQt Widgets Designer によって検索される場所にインストールされるようにすることが重要です。これを行うには、プロジェクトのターゲットパスを指定し、それをインストール対象のリストに追加します:
set(INSTALL_EXAMPLEDIR "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_PLUGINS}/designer")
install(TARGETS taskmenuextension
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
)タスクメニュー拡張機能はライブラリとして作成されます。プロジェクトがインストールされると(ninja install または同等のインストール手順を使用)、他のQt Widgets Designer プラグインとともにインストールされます。
プラグインの詳細については、「Qt プラグインの作成方法」のドキュメントを参照してください。
qmake
以下の例は、プラグインをQt Widgets Designer ライブラリにリンクする方法を示しています:
TEMPLATE = lib
CONFIG += plugin
QT += widgets designer次の例は、ウィジェットのヘッダーファイルとソースファイルを追加する方法を示しています:
HEADERS += tictactoe.h \
tictactoedialog.h \
tictactoeplugin.h \
tictactoetaskmenu.h
SOURCES += tictactoe.cpp \
tictactoedialog.cpp \
tictactoeplugin.cpp \
tictactoetaskmenu.cpp
OTHER_FILES += tictactoe.json次の例は、Qt Widgets Designer のプラグインパスにプラグインをインストールする方法を示しています:
target.path = $$[QT_INSTALL_PLUGINS]/designer
INSTALLS += targetTicTacToePlugin クラスの定義
TicTacToePlugin クラスは、the のTicTacToeクラスをQt Widgets Designer に公開します。その定義は、「カスタムウィジェットプラグイン」の例で詳しく説明されているプラグインクラスと同等です。この特定のカスタムウィジェットに固有なクラス定義の部分は、クラス名のみです。
Qtがこのウィジェットをプラグインとして認識できるようにするには、Q_PLUGIN_METADATA() マクロを追加して、ウィジェットに関する関連情報をエクスポートします。
#ifndef TICTACTOEPLUGIN_H
#define TICTACTOEPLUGIN_H
#include <QtUiPlugin/QDesignerCustomWidgetInterface>
class QIcon;
class QWidget;
class TicTacToePlugin : public QObject, public QDesignerCustomWidgetInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")
Q_INTERFACES(QDesignerCustomWidgetInterface)
public:
explicit TicTacToePlugin(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:
bool initialized = false;
};
#endifこのプラグインクラスは、Qt Widgets Designer を通じて、クラス名やインクルードファイルなど、プラグインに関する基本情報を提供します。 さらに、このクラスはTicTacToe ウィジェットのインスタンスを作成する方法も知っています。TicTacToePluginは、プラグインがQt Widgets Designer に読み込まれた後に呼び出されるinitialize()関数も定義しています。この関数のQDesignerFormEditorInterface パラメータは、Qt Widgets Designer のすべてのAPIへのゲートウェイをプラグインに提供します。
TicTacToePlugin クラスは、QObject とQDesignerCustomWidgetInterface の両方から継承されています。多重継承を使用する際は、すべてのインターフェース(つまり、Q_OBJECT を継承していないクラス)を、Q_INTERFACES()マクロを使用してメタオブジェクトシステムに通知するようにすることが重要です。これにより、Qt Widgets Designer は、QObject ポインタのみを使用して、qobject_cast()を通じてサポートされているインターフェースを照会できるようになります。
TicTacToePlugin クラスの実装
TicTacToePlugin クラスの実装は、大部分において「カスタムウィジェットプラグイン」の例のプラグインクラスと同等です:
TicTacToePlugin::TicTacToePlugin(QObject *parent)
: QObject(parent)
{
}
QString TicTacToePlugin::name() const
{
return u"TicTacToe"_s;
}
QString TicTacToePlugin::group() const
{
return u"Display Widgets [Examples]"_s;
}
QString TicTacToePlugin::toolTip() const
{
return u"Tic Tac Toe Example, demonstrating class QDesignerTaskMenuExtension (C++)"_s;
}
QString TicTacToePlugin::whatsThis() const
{
return {};
}
QString TicTacToePlugin::includeFile() const
{
return u"tictactoe.h"_s;
}
QIcon TicTacToePlugin::icon() const
{
return {};
}
bool TicTacToePlugin::isContainer() const
{
return false;
}
QWidget *TicTacToePlugin::createWidget(QWidget *parent)
{
auto *ticTacToe = new TicTacToe(parent);
ticTacToe->setState(u"-X-XO----"_s);
return ticTacToe;
}
bool TicTacToePlugin::isInitialized() const
{
return initialized;
}唯一大きく異なるのは initialize() 関数です:
void TicTacToePlugin::initialize(QDesignerFormEditorInterface *formEditor)
{initialize() 関数は、引数としてQDesignerFormEditorInterface オブジェクトを受け取ります。QDesignerFormEditorInterface クラスは、Qt Widgets Designer のコンポーネントへのアクセスを提供します。
Qt Widgets Designer では、カスタムウィジェットプラグインとツールプラグインの2種類のプラグインを作成できます。QDesignerFormEditorInterface は、ツールプラグインの作成に通常必要なすべてのQt Widgets Designer コンポーネント(拡張機能マネージャー、オブジェクトインスペクター、プロパティエディター、ウィジェットボックス)へのアクセスを提供します。カスタムウィジェットプラグインも、これらのコンポーネントにアクセスできます。
if (initialized)
return;
auto *manager = formEditor->extensionManager();
Q_ASSERT(manager != nullptr);カスタムウィジェットプラグインに関連する拡張機能を作成する際は、`QDesignerFormEditorInterface ` パラメータから取得する `Qt Widgets Designer` の現在の拡張機能マネージャにアクセスする必要があります。
Qt Widgets Designer QDesignerFormEditorInterface は、 のすべてのコンポーネント(アクションエディタ、オブジェクトインスペクタ、プロパティエディタ、ウィジェットボックス、および拡張機能およびフォームウィンドウマネージャ)に関する情報を保持しています。Qt Designer
QExtensionManager クラスは、Qt Widgets Designer 向けの拡張機能管理機能を提供します。Qt Widgets Designer の現在の拡張機能マネージャーを使用することで、指定されたオブジェクトの拡張機能を取得できます。また、指定されたオブジェクトに対して拡張機能を登録したり、登録を解除したりすることも可能です。拡張機能とは、Qt Widgets Designer の動作を変更するオブジェクトであることを覚えておいてください。
拡張機能を登録する際、実際には関連付けられた拡張機能ファクトリが登録されます。Qt Widgets Designer では、拡張機能ファクトリを使用して、必要に応じて名前付き拡張機能を検索・作成します。したがって、この例では、ユーザーがタスクメニューを要求するまで、タスクメニュー拡張機能自体は作成されません。
manager->registerExtensions(new TicTacToeTaskMenuFactory(manager),
Q_TYPEID(QDesignerTaskMenuExtension));
initialized = true;
}
QString TicTacToePlugin::domXml() const
{
return uR"(
<ui language="c++">
<widget class="TicTacToe" name="ticTacToe"/>
<customwidgets>
<customwidget>
<class>TicTacToe</class>
<propertyspecifications>
<tooltip name="state">Tic Tac Toe state</tooltip>
<stringpropertyspecification name="state" notr="true" type="singleline"/>
</propertyspecifications>
</customwidget>
</customwidgets>
</ui>
)"_s;
}`TicTacToeTaskMenuFactory `オブジェクトを作成し、`QDesignerFormEditorInterface `パラメータから取得した`Qt Widgets Designer`の現在の`extension manager `を使用して登録します。第1引数は新しく作成されたファクトリ、第2引数は文字列形式の拡張機能識別子です。`Q_TYPEID() `マクロは、単にその文字列を`QLatin1String`に変換するだけです。
TicTacToeTaskMenuFactory クラスは、QExtensionFactory のサブクラスです。ユーザーが、指定されたタスクメニュー拡張子を持つウィジェット上でマウスの右ボタンをクリックしてタスクメニューを要求すると、Qt Widgets Designer の拡張子マネージャーは、登録されているすべてのファクトリを順に調べ、選択されたウィジェット用のタスクメニュー拡張子を作成できる最初のファクトリを呼び出します。このファクトリは、TicTacToeTaskMenu オブジェクト(拡張子)を作成します。
デフォルト値は必要ないため、QDesignerCustomWidgetInterface::domXml() 関数(Qt Widgets Designer で使用される標準 XML 形式でウィジェットのデフォルト設定を含む)の再実装は省略します。
Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QDesignerCustomWidgetInterface")最後に、Q_PLUGIN_METADATA() マクロを使用して、Qt のプラグイン処理クラスで使用できるように TicTacToePlugin クラスをエクスポートします。このマクロにより、Qt Widgets Designer がカスタムウィジェットにアクセスし、構築できるようになります。このマクロがないと、Qt Widgets Designer がこのウィジェットを使用する方法はありません。
TicTacToeTaskMenuFactory クラスの定義
TicTacToeTaskMenuFactory クラスは、Qt Widgets Designer 向けの標準的な拡張ファクトリを提供するQExtensionFactory を継承しています。
class TicTacToeTaskMenuFactory : public QExtensionFactory
{
Q_OBJECT
public:
explicit TicTacToeTaskMenuFactory(QExtensionManager *parent = nullptr);
protected:
QObject *createExtension(QObject *object, const QString &iid, QObject *parent) const override;
};このサブクラスの目的は、QExtensionFactory::createExtension() 関数を再実装し、TicTacToe のタスクメニュー拡張機能を作成できるようにすることです。
TicTacToeTaskMenuFactory クラスの実装
このクラスのコンストラクタは、単に基底クラスのQExtensionFactory コンストラクタを呼び出すだけです。
TicTacToeTaskMenuFactory::TicTacToeTaskMenuFactory(QExtensionManager *parent)
: QExtensionFactory(parent)
{
}前述のように、このファクトリは、ユーザーがQt Widgets Designer で指定されたタスクメニュー拡張機能を持つウィジェット上でマウスの右ボタンをクリックしてタスクメニューを要求したときに呼び出されます。
Qt Widgets Designer要求された拡張機能がコンテナ、メンバーシート、プロパティシート、またはタスクメニューのいずれに関連付けられているかに関わらず、その動作は同じです。拡張機能マネージャーは、登録されているすべての拡張機能ファクトリを順に処理し、各ファクトリに対してcreateExtension() を呼び出し、要求された拡張機能を作成して応答するファクトリが見つかるまで続けます。
QObject *TicTacToeTaskMenuFactory::createExtension(QObject *object,
const QString &iid,
QObject *parent) const
{
if (iid != Q_TYPEID(QDesignerTaskMenuExtension))
return nullptr;
if (auto *tic = qobject_cast<TicTacToe*>(object))
return new TicTacToeTaskMenu(tic, parent);
return nullptr;
}したがって、TicTacToeTaskMenuFactory::createExtension() で行う最初の処理は、要求された拡張機能がタスクメニュー拡張機能であるかどうかを確認することです。もしそうであり、かつそれを要求しているウィジェットが `TicTacToe ` ウィジェットである場合は、`TicTacToeTaskMenu ` オブジェクトを作成して返します。そうでない場合は、単に null ポインタを返し、Qt Widgets Designer の拡張機能マネージャーが登録されたファクトリの検索を継続できるようにします。
TicTacToeTaskMenu クラスの定義

TicTacToeTaskMenu クラスはQDesignerTaskMenuExtension を継承しており、これによりQt Widgets Designer のタスクメニューに(QAction形式の)カスタムエントリを追加することができます。
class TicTacToeTaskMenu : public QObject, public QDesignerTaskMenuExtension
{
Q_OBJECT
Q_INTERFACES(QDesignerTaskMenuExtension)
public:
explicit TicTacToeTaskMenu(TicTacToe *tic, QObject *parent);
QAction *preferredEditAction() const override;
QList<QAction *> taskActions() const override;
private slots:
void editState();
private:
QAction *editStateAction;
TicTacToe *ticTacToe;
};preferredEditAction() およびtaskActions() 関数を再実装します。なお、2 つの引数(親ウィジェットと、タスクメニューの要求対象となるTicTacToe ウィジェット)を受け取るコンストラクタを実装している点に注意してください。
さらに、プライベートなeditState() スロット、カスタム版のeditStateAction 、および状態を変更したいTicTacToe ウィジェットへのプライベートポインタを宣言します。
TicTacToeTaskMenu クラスの実装
TicTacToeTaskMenu::TicTacToeTaskMenu(TicTacToe *tic, QObject *parent)
: QObject(parent)
, editStateAction(new QAction(tr("Edit State..."), this))
, ticTacToe(tic)
{
connect(editStateAction, &QAction::triggered, this, &TicTacToeTaskMenu::editState);
}コンストラクタでは、まずパラメータとして渡されたTicTacToe ウィジェット(つまり、状態を変更したいウィジェット)への参照を保存します。これは、後でカスタムアクションが呼び出された際に必要になります。また、カスタムeditStateAction を作成し、それをeditState() スロットに接続します。
void TicTacToeTaskMenu::editState()
{
TicTacToeDialog dialog(ticTacToe);
dialog.exec();
}editState() スロットは、ユーザーがTicTacToe ウィジェットのタスクメニューから「Edit State...」オプションを選択するたびに呼び出されます。このスロットは、ウィジェットの現在の状態を表示し、ユーザーがゲームをプレイしてその状態を編集できるようにするTicTacToeDialog を作成します。
QAction *TicTacToeTaskMenu::preferredEditAction() const
{
return editStateAction;
}preferredEditAction() 関数を再実装し、TicTacToe ウィジェットを選択してF2キーを押した際に呼び出されるアクションとして、独自のeditStateAction を返すようにします。
QList<QAction *> TicTacToeTaskMenu::taskActions() const
{
return QList<QAction *>{editStateAction};
}taskActions() 関数を再実装し、TicTacToe ウィジェットのタスクメニューで、デフォルトのメニュー項目よりも上に表示されるように、カスタムアクションのリストを返すようにします。
TicTacToeDialog クラスの定義

TicTacToeDialog クラスはQDialog を継承しています。このダイアログにより、ユーザーは現在選択されているTic-Tac-Toeプラグインの状態を変更できます。
class TicTacToeDialog : public QDialog
{
Q_OBJECT
public:
explicit TicTacToeDialog(TicTacToe *plugin = nullptr, QWidget *parent = nullptr);
QSize sizeHint() const override;
private slots:
void resetState();
void saveState();
private:
TicTacToe *editor;
TicTacToe *ticTacToe;
QDialogButtonBox *buttonBox;
};sizeHint() 関数を再実装します。また、2つのプライベートスロット、resetState() とsaveState() を宣言します。ダイアログのボタンやレイアウトに加え、2つのTicTacToe ポインタを宣言します。1つはユーザーが操作できるウィジェットへのポインタ、もう1つはユーザーが編集したい状態を持つ元のカスタムウィジェットプラグインへのポインタです。
TicTacToeDialog クラスの実装
TicTacToeDialog::TicTacToeDialog(TicTacToe *tic, QWidget *parent)
: QDialog(parent)
, editor(new TicTacToe)
, ticTacToe(tic)
, buttonBox(new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel
| QDialogButtonBox::Reset))
{
editor->setState(ticTacToe->state());
connect(buttonBox->button(QDialogButtonBox::Reset), &QAbstractButton::clicked,
this, &TicTacToeDialog::resetState);
connect(buttonBox, &QDialogButtonBox::accepted, this, &TicTacToeDialog::saveState);
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
auto *mainLayout = new QVBoxLayout(this);
mainLayout->addWidget(editor);
mainLayout->addWidget(buttonBox);
setWindowTitle(tr("Edit State"));
}コンストラクタでは、まずパラメータとして渡された TicTacToe ウィジェット(つまり、ユーザーが変更したい状態を持つウィジェット)への参照を保存します。次に、新しいTicTacToe ウィジェットを作成し、その状態をパラメータとして渡されたウィジェットの状態と同じになるように設定します。
最後に、ダイアログのボタンとレイアウトを作成します。
QSize TicTacToeDialog::sizeHint() const
{
return {250, 250};
}ダイアログが適切なサイズになるよう、sizeHint() 関数を再実装します。
void TicTacToeDialog::resetState()
{
editor->clearBoard();
}resetState() スロットは、ユーザーが「リセット」ボタンを押すたびに呼び出されます。ここで行う唯一の処理は、エディタウィジェット(つまり、ダイアログのコンストラクタで作成したTicTacToe ウィジェット)に対してclearBoard() 関数を呼び出すことです。
void TicTacToeDialog::saveState()
{saveState() スロットは、ユーザーが「OK」ボタンを押すたびに呼び出され、エディタウィジェットの状態を、状態を変更したい対象のウィジェットに転送します。状態の変更をQt Widgets Designer で認識させるためには、QDesignerFormWindowInterface クラスを使用して、後者のウィジェットのstateプロパティを設定する必要があります。
QDesignerFormWindowInterface このインターフェースは、関連付けられたフォームウィンドウに関する情報を提供するとともに、そのプロパティを変更することを可能にします。このインターフェースは直接インスタンス化されることを意図したものではなく、Qt Widgets Designer のフォームウィンドウマネージャによって制御されるQt Widgets Designer の現在のフォームウィンドウへのアクセスを提供するためのものです。
特定のウィジェットを含むフォームウィンドウを検索する場合は、静的関数 `QDesignerFormWindowInterface::findFormWindow()` を使用できます:
if (auto *formWindow = QDesignerFormWindowInterface::findFormWindow(ticTacToe))
formWindow->cursor()->setProperty("state", editor->state());(状態を変更したい)ウィジェットのフォームウィンドウを取得した後、QDesignerFormWindowInterface::cursor() 関数を使用して、そのフォームウィンドウのカーソルを取得します。
QDesignerFormWindowCursorInterface クラスは、フォームウィンドウのテキストカーソルへのインターフェースを提供します。カーソルを取得したら、QDesignerFormWindowCursorInterface::setProperty()関数を使用して状態プロパティを設定できます。
accept();
}最後に、QEvent::accept() 関数を呼び出し、イベントオブジェクトの accept フラグを設定します。accept パラメータを設定することで、イベントレシーバーがそのイベントを受け入れることを示します。不要なイベントは親ウィジェットに伝播される可能性があります。
TicTacToeクラスの定義
TicTacToe クラスは、ユーザーが三目並べゲームをプレイできるようにするカスタムウィジェットです。
class TicTacToe : public QWidget
{
Q_OBJECT
Q_PROPERTY(QString state READ state WRITE setState)
public:
explicit TicTacToe(QWidget *parent = nullptr);
QSize minimumSizeHint() const override;
QSize sizeHint() const override;
void setState(const QString &newState);
QString state() const;
void clearBoard();
protected:
void mousePressEvent(QMouseEvent *event) override;
void paintEvent(QPaintEvent *event) override;
private:
static constexpr char16_t Empty = '-';
static constexpr char16_t Cross = 'X';
static constexpr char16_t Nought = 'O';
QRect cellRect(int position) const;
int cellWidth() const { return width() / 3; }
int cellHeight() const { return height() / 3; }
QString myState;
int turnNumber = 0;
};TicTacToe クラスの定義で注目すべき主な点は、state プロパティの宣言と、それに付随するstate() およびsetState() 関数です。
TicTacToe ウィジェットの状態をプロパティとして宣言することで、Qt Widgets Designer からその状態を参照できるようにする必要があります。これにより、Qt Widgets Designer は、例えばプロパティエディタを活用するなどして、TicTacToe ウィジェットがQWidget やQObject から継承するプロパティを管理するのと同じ方法で、その状態を管理できるようになります。
© 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.