QAbstractItemDelegate Class

QAbstractItemDelegateクラスは、モデルのデータ項目を表示・編集するために使用します。詳細...

Header: #include <QAbstractItemDelegate>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Inherits: QObject
Inherited By:

QItemDelegate and QStyledItemDelegate

パブリック型

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)
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 クラスは、Model/View クラスの一つであり、Qt のmodel/view フレームワークの一部です。

項目をカスタムな方法でレンダリングするには、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つのアプローチがあります。一つ目は、エディター・ウィジェットを作成し、アイテムの上に直接表示する方法です。これを行うには、createEditor() を再実装してエディタ・ウィジェットを提供し、setEditorData() でモデルからのデータをエディタに投入し、setModelData() でデリゲートがエディタからのデータでモデルを更新できるようにする必要があります。

2つ目のアプローチは、editorEvent ()を再実装することで、ユーザーイベントを直接処理することです。

モデル/ビュー・プログラミングQStyledItemDelegate およびQStyleも参照してください

メンバ型ドキュメント

enum QAbstractItemDelegate::EndEditHint

この列挙型は、デリゲートがモデルコンポーネントとビューコンポーネントに与えることができる、ユーザーにとって快適なモデル内のデータ編集を行うための様々なヒントを記述します。

定数説明
QAbstractItemDelegate::NoHint0推奨されるアクションはありません。

これらのヒントは、デリゲートにビューの振る舞いに影響を与えます:

定数説明
QAbstractItemDelegate::EditNextItem1ビューは、ビュー内の次のアイテムのエディタを開くためにデリゲートを使用する必要があります。
QAbstractItemDelegate::EditPreviousItem2ビューは、ビュー内の前のアイテムのエディタを開くためにデリゲートを使用する必要があります。

カスタムのビューは、nextとpreviousの概念を異なって解釈する可能性があることに注意してください。

以下のヒントは、パフォーマンスを向上させたりネットワーク帯域幅を節約するためにローカルでデータを操作するような、データをキャッシュするモデルを使用する場合に最も有用です。

定数説明
QAbstractItemDelegate::SubmitModelCache3モデルがデータをキャッシュする場合、キャッシュされたデータを基礎となるデータストアに書き出します。
QAbstractItemDelegate::RevertModelCache4モデルがデータをキャッシュする場合、キャッシュされたデータを破棄し、基礎となるデータストアのデータと置き換えるべきです。

モデルとビューは適切な方法でこれらのヒントに応答する必要がありますが、カスタムコンポーネントは、関連性がない場合、これらのヒントの一部または全部を無視することができます。

メンバ関数ドキュメント

[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 、アイテムのmodelindex 、アイテムのレンダリングに使用されたoption

アイテムの編集が開始されなくても、マウスイベントはeditorEvent()に送られます。これは例えば、アイテム上でマウスの右ボタンが押されたときにコンテキストメニューを開きたい場合に便利です。

基本実装はfalse を返します(イベントを処理していないことを示します)。

[virtual] bool QAbstractItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)

ヘルプイベントが発生するたびに、この関数はevent view option と、イベントが発生したアイテムに対応するindex で呼び出されます。

デリゲートがイベントを処理できる場合はtrue を返し、そうでない場合はfalse を返します。trueの戻り値は、インデックスを使用して取得されたデータが必要な役割を持っていたことを示します。

QEvent::ToolTipQEvent::WhatsThis イベントが正常に処理された場合、ユーザのシステム構成に応じて関連するポップアップが表示されるかもしれません。

QHelpEventも参照してください

[pure virtual] void QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const

カスタムレンダリングを提供したい場合、この純粋な抽象関数を再実装する必要があります。項目index で指定された項目をレンダリングするには、painter と styleoption を使用します。

これを再実装する場合は、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)

このシグナルは、indexsizeHint() が変更されたときに発せられなければなりません。

ビューは自動的にこのシグナルに接続し、必要に応じてアイテムをリレーアウトします。

[virtual] void QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const

与えられたindex を持つアイテムのeditor のジオメトリを、option で指定された矩形に従って更新します。 アイテムに内部レイアウトがある場合、エディタはそれに従ってレイアウトされます。インデックスには、使用されているモデルに関する情報が含まれていることに注意してください。

基本実装は何もしません。カスタム編集を行いたい場合は、この関数を再実装する必要があります。

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