QAbstractItemDelegate Class
QAbstractItemDelegate クラスは、モデルからのデータ項目を表示および編集するために使用されます。詳細...
| ヘッダー: | #include <QAbstractItemDelegate> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 継承元: | QObject |
| 継承元: |
パブリック型
| enum | EndEditHint { NoHint, EditNextItem, EditPreviousItem, SubmitModelCache, RevertModelCache } |
パブリック関数
| QAbstractItemDelegate(QObject *parent = nullptr) | |
| virtual | ~QAbstractItemDelegate() |
| virtual QWidget * | createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const |
| virtual void | destroyEditor(QWidget *editor, const QModelIndex &index) const |
| virtual bool | editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) |
(since 6.10) bool | handleEditorEvent(QObject *editor, QEvent *event) |
| virtual bool | helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) |
| virtual void | paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| virtual void | setEditorData(QWidget *editor, const QModelIndex &index) const |
| virtual void | setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const |
| virtual QSize | sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0 |
| virtual void | updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const |
シグナル
| void | closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint) |
| void | commitData(QWidget *editor) |
| void | sizeHintChanged(const QModelIndex &index) |
詳細な説明
QAbstractItemDelegate は、モデル/ビューアーキテクチャにおけるデリゲート用のインターフェースと共通機能を提供します。デリゲートは、ビューに個々のアイテムを表示し、モデルデータの編集を処理します。
QAbstractItemDelegate クラスは、モデル/ビュークラスの一つであり、Qtのモデル/ビューフレームワークの一部です。
アイテムを独自の方法でレンダリングするには、paint() およびsizeHint() を実装する必要があります。QStyledItemDelegate クラスは、これらの関数のデフォルトの実装を提供しています。カスタムレンダリングが必要ない場合は、代わりにこのクラスをサブクラス化してください。
ここでは、アイテム内にプログレスバーを描画する例を示します。この例では、パッケージ管理プログラムを想定しています。

`QStyledItemDelegate` から継承する `WidgetDelegate ` クラスを作成します。描画処理は `paint()` 関数内で行います:
void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if (index.column() == 1) {
int progress = index.data().toInt();
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = option.rect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString::number(progress) + "%";
progressBarOption.textVisible = true;
QApplication::style()->drawControl(QStyle::CE_ProgressBar,
&progressBarOption, painter);
} else
QStyledItemDelegate::paint(painter, option, index);ここで、QStyleOptionProgressBar を使用し、そのメンバーを初期化している点に注意してください。その後、現在のQStyle を使用して描画を行うことができます。
カスタム編集機能を実装するには、2つのアプローチがあります。 1つ目のアプローチは、エディタウィジェットを作成し、それをアイテムの上に直接表示することです。これを行うには、エディタウィジェットを提供するためにcreateEditor()を、モデルからのデータでエディタを初期化するためにsetEditorData()を、そしてデリゲートがエディタからのデータでモデルを更新できるようにするためにsetModelData()を再実装する必要があります。
2つ目のアプローチは、editorEvent()を再実装して、ユーザーイベントを直接処理する方法です。
「モデル/ビュープログラミング」、「QStyledItemDelegate 」、および「QStyle 」も参照してください 。
メンバ型のドキュメント
enum QAbstractItemDelegate::EndEditHint
この列挙型は、モデル内のデータ編集をユーザーにとって快適なものにするために、デリゲートがモデルおよびビューコンポーネントに与えることができるさまざまなヒントを定義するものです。
| 定数 | 値 | 説明 |
|---|---|---|
QAbstractItemDelegate::NoHint | 0 | 実行すべき推奨アクションはありません。 |
これらのヒントにより、デリゲートはビューの動作に影響を与えることができます:
| 定数 | 値 | 説明 |
|---|---|---|
QAbstractItemDelegate::EditNextItem | 1 | ビューは、デリゲートを使用して、ビュー内の次の項目に対してエディタを開く必要があります。 |
QAbstractItemDelegate::EditPreviousItem | 2 | ビューは、デリゲートを使用して、ビュー内の前の項目に対してエディタを開く必要があります。 |
カスタムビューでは、「次」と「前」の概念の解釈が異なる場合があることに注意してください。
以下のヒントは、パフォーマンスの向上やネットワーク帯域幅の節約のためにデータをローカルで操作するなど、データをキャッシュするモデルを使用する場合に特に役立ちます。
| 定数 | 値 | 説明 |
|---|---|---|
QAbstractItemDelegate::SubmitModelCache | 3 | モデルがデータをキャッシュしている場合は、キャッシュされたデータを基になるデータストアに書き出す必要があります。 |
QAbstractItemDelegate::RevertModelCache | 4 | モデルがデータをキャッシュしている場合は、キャッシュされたデータを破棄し、基盤となるデータストアのデータに置き換える必要があります。 |
モデルやビューはこれらのヒントに適切な方法で対応すべきですが、カスタムコンポーネントは、関連性がない場合は、その一部またはすべてを無視してもかまいません。
メンバ関数のドキュメント
[explicit] QAbstractItemDelegate::QAbstractItemDelegate(QObject *parent = nullptr)
指定されたparent を持つ新しい抽象アイテムデリゲートを作成します。
[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()
抽象アイテムデリゲートを破棄します。
[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
このシグナルは、ユーザーが指定されたeditor を使用して項目の編集を完了したときに発火します。
hint は、編集完了後にモデルとビューの挙動をデリゲートが制御する手段を提供します。これは、ユーザーに快適な編集体験を提供するために、次にどのようなアクションを実行すべきかをこれらのコンポーネントに指示するものです。例えば、EditNextItem が指定されている場合、ビューはデリゲートを使用して、モデル内の次の項目でエディタを開く必要があります。
「EndEditHint」も参照してください 。
[signal] void QAbstractItemDelegate::commitData(QWidget *editor)
このシグナルは、editor ウィジェットがデータの編集を完了し、そのデータをモデルに書き戻そうとする際に発火する必要があります。
[virtual] QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
指定されたindex を用いてデータ項目を編集するために使用するエディタを返します。インデックスには、使用されているモデルに関する情報が含まれていることに注意してください。エディタの親ウィジェットはparent で指定され、項目のオプションはoption で指定されます。
基本実装では、nullptr が返されます。カスタム編集を行いたい場合は、この関数を再実装する必要があります。
返されるエディタウィジェットは、Qt::StrongFocus を持つ必要があります。そうでない場合、ウィジェットが受け取ったQMouseEventはビューに伝播してしまいます。エディタが独自の背景を描画しない限り(例:setAutoFillBackground() を使用)、ビューの背景が透けて見えてしまいます。
destroyEditor()、setModelData()、およびsetEditorData()も参照してください 。
[virtual] void QAbstractItemDelegate::destroyEditor(QWidget *editor, const QModelIndex &index) const
指定されたindex を持つデータ項目の編集にeditor が不要になり、破棄すべき場合に呼び出されます。デフォルトの動作は、エディタに対してdeleteLaterを呼び出すことです。例えば、この関数を再実装することで、この削除を回避することが可能です。
createEditor()も参照してください 。
[virtual] bool QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
項目の編集が開始されると、この関数は、編集をトリガーしたevent 、model 、項目のindex 、および項目のレンダリングに使用されるoption を引数として呼び出されます。
アイテムの編集を開始しない場合でも、マウスイベントはeditorEvent()に送信されます。これは、例えば、アイテム上でマウスの右ボタンを押した際にコンテキストメニューを開きたい場合などに役立ちます。
基本実装は、false を返します(これは、イベントを処理していないことを示します)。
[since 6.10] bool QAbstractItemDelegate::handleEditorEvent(QObject *editor, QEvent *event)
現在アクティブなeditor に代わって、イベントの標準的な処理を実装します。QAbstractItemModel のサブクラスにおいて、eventFilter()のオーバーライドからこの関数を呼び出し、その結果を返してください。イベント処理の重複を避けるため、この関数を呼び出した後は、親クラスのeventFilter()の実装を呼び出さないでください。
指定されたeditor が有効なQWidget であり、指定されたevent が処理対象である場合はtrue を返し、そうでない場合はfalse を返します。デフォルトでは、以下のキー押下イベントが処理されます:
- Tab
- Backtab
- Enter
- Return
- Esc
editor の型がQTextEdit またはQPlainTextEdit である場合、Tab 、Backtab 、Enter 、およびReturn キーは処理されません。
Tab 、Backtab 、Enter 、およびReturn のキー押下イベントの場合、editor のデータがモデルにコミットされ、エディタが閉じられます。event がTab のキー押下である場合、ビューはビュー内の次の項目でエディタを開きます。同様に、event がBacktab のキー押下である場合、ビューはビュー内の前の項目でエディタを開きます。
イベントがEsc のキー押下イベントである場合、editor はデータをコミットせずに閉じられます。
この関数は Qt 6.10 で導入されました。
commitData() およびcloseEditor()も参照してください 。
[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
ヘルプイベントが発生するたびに、この関数は、event 、view 、option 、およびイベントが発生した項目に対応するindex を引数として呼び出されます。
デリゲートがイベントを処理できる場合はtrue を返し、そうでない場合はfalse を返します。戻り値が true の場合、インデックスを使用して取得したデータが要求された役割を持っていたことを示します。
QEvent::ToolTip およびQEvent::WhatsThis イベントが正常に処理された場合、ユーザーのシステム設定に応じて、関連するポップアップが表示されることがあります。
「QHelpEvent」も参照してください 。
[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
カスタムレンダリングを実装したい場合は、この純粋な抽象関数を再実装する必要があります。painter を使用し、option をスタイル設定して、index で指定されたアイテムをレンダリングしてください。
これを再実装する場合は、sizeHint() も再実装する必要があります。
[virtual] void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
指定されたeditor の内容を、指定されたindex にある項目のデータに設定します。なお、このインデックスには、使用されているモデルに関する情報が含まれていることに注意してください。
基本実装では何も行われません。独自の編集機能を実装したい場合は、この関数を再実装する必要があります。
setModelData()も参照してください 。
[virtual] void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
model 内の指定されたindex にある項目のデータを、指定されたeditor の内容に設定します。
基本実装では何も行われません。カスタム編集を行いたい場合は、この関数を再実装する必要があります。
setEditorData()も参照してください 。
[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
カスタムレンダリングを実装したい場合は、この純粋な抽象関数を再実装する必要があります。オプションは `option ` で指定され、モデル項目は `index` で指定されます。
これを再実装する場合は、paint() も再実装する必要があります。
[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)
index のsizeHint()が変更された際に、このシグナルを発行する必要があります。
ビューはこのシグナルに自動的に接続され、必要に応じてアイテムのレイアウトを再構築します。
[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
指定されたindex を持つアイテムのeditor のジオメトリを、option で指定された矩形に基づいて更新します。アイテムに内部レイアウトがある場合、エディタはそれに応じてレイアウトされます。なお、インデックスには使用されているモデルに関する情報が含まれています。
基本実装では何も行われません。カスタム編集を行いたい場合は、この関数を再実装する必要があります。
© 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.