QStyledItemDelegate Class

QStyledItemDelegateクラスは、モデルのデータ項目の表示と編集機能を提供します。詳細...

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

QSqlRelationalDelegate

パブリック関数

QStyledItemDelegate(QObject *parent = nullptr)
virtual ~QStyledItemDelegate()
virtual QString displayText(const QVariant &value, const QLocale &locale) const
QItemEditorFactory *itemEditorFactory() const
void setItemEditorFactory(QItemEditorFactory *factory)

再実装パブリック関数

virtual QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void setEditorData(QWidget *editor, const QModelIndex &index) const override
virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const override

保護された関数

virtual void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

再実装された保護された関数

virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) override
virtual bool eventFilter(QObject *editor, QEvent *event) override

詳細説明

モデルからのデータを Qt アイテムビュー、例えばQTableView に表示する場合、個々のアイテムはデリゲートによって描画されます。また、アイテムが編集されるとき、編集が行われている間、アイテムビューの上に配置されるエディタウィジェットを提供します。QStyledItemDelegate は、全ての Qt アイテムビューのデフォルトのデリゲートで、作成時にインストールされます。

QStyledItemDelegateクラスはモデル/ビュークラスの一つで、Qtのモデル/ビューフレームワークの一部です。このデリゲートは、アイテムの表示や編集をモデルやビューから独立して開発することを可能にします。

モデル内のアイテムのデータには、ItemDataRole が割り当てられます。各アイテムは、役割ごとにQVariant を格納することができます。QStyledItemDelegateは、boolean、integer、stringなど、ユーザーが期待する最も一般的なデータ型の表示と編集を実装します。

データの描画は、モデル内のどのロールを持っているかによって異なります。以下の表は、それぞれのロールとデリゲートが扱えるデータ型について説明したものです。ビューにおける項目の外観を決定するために、モデルがそれぞれのロールに適切なデータを返すようにすれば十分であることがよくあります。

エディタはQItemEditorFactory で作成されます。QItemEditorFactory で提供されるデフォルトの静的インスタンスは、すべてのアイテムデリゲートにインストールされます。setItemEditorFactory() を使用してカスタムファクトリを設定するか、QItemEditorFactory::setDefaultFactory() を使用して新しいデフォルトファクトリを設定することができます。

QItemEditorFactory *editorFactory = new QItemEditorFactory;
QItemEditorCreatorBase *creator = new QStandardItemEditorCreator<MyFancyDateTimeEdit>();
editorFactory->registerEditor(QMetaType::QDateTime, creator);

QItemEditorFactory::setDefaultFactory(editorFactory);

新しいファクトリーが設定されると、すべての標準アイテムデリゲートはそれを使用します(つまり、新しいデフォルトファクトリーが設定される前に作成されたデリゲートも使用します)。

編集されるのは、EditRole でアイテムモデルに格納されたデータです。アイテムエディターファクトリーのよりハイレベルな紹介は、QItemEditorFactory クラスを参照してください。

QStyledItemDelegateのサブクラス化

デリゲートが必要なデータ型の描画をサポートしていない場合や、アイテムの描画をカスタマイズしたい場合は、QStyledItemDelegateをサブクラス化し、paint ()、場合によってはsizeHint ()を再実装する必要があります。paint() 関数は各アイテムに対して個別に呼び出され、sizeHint() を使用することで、各アイテムのヒントを指定することができます。

paint() を再実装する場合、描画したいデータ型を処理し、その他のデータ型にはスーパークラスの実装を使用するのが一般的です。

チェック ボックス インジケータの描画は、現在のスタイルによって実行されます。スタイルでは、さまざまなデータ ロールのデータを描画するサイズと外接矩形も指定します。項目自体の外接矩形もスタイルによって計算されます。したがって、すでにサポートされているデータ型を描画する場合は、これらの外接矩形をスタイルで指定することをお勧めします。これについては、QStyle クラスの説明を参照してください。

スタイルによって計算される外接矩形やチェック ボックス インジケータの描画を変更したい場合は、QStyle をサブクラス化します。ただし、アイテムのサイズは、sizeHint() を再実装することによっても変更できることに注意してください。

エディタ・アイテム・ファクトリを使用せずに、カスタム・デリゲートがエディタを提供することも可能です。この場合、以下の仮想関数を再実装する必要があります:

  • createEditor() はモデルからデータを変更するために使用されるウィジェットを返し、編集動作をカスタマイズするために再実装することができます。
  • setEditorData() は、操作するデータをウィジェットに提供します。
  • updateEditorGeometry() は、アイテムビューに対してエディタが正しく表示されるようにします。
  • setModelData() は、更新されたデータをモデルに返します。

Star Delegateの例では、これらのメソッドを再実装してエディタを作成しています。

QStyledItemDelegateとQItemDelegateの比較

Qt 4.4 以降、QItemDelegate と QStyledItemDelegate の 2 つのデリゲート・クラスがあります。しかし、デフォルトのデリゲートはQStyledItemDelegateです。これら2つのクラスは、ビュー内のアイテムにペイントしたりエディタを提供したりするための独立した代替手段です。両者の違いは、QStyledItemDelegateが現在のスタイルを使用してアイテムをペイントすることです。従って、カスタムデリゲートを実装する場合や、Qtスタイルシートを扱う場合には、QStyledItemDelegateを基本クラスとして使用することをお勧めします。カスタムデリゲートが描画にスタイルを使用する必要がない限り、どちらのクラスに必要なコードも等しくなるはずです。

アイテムビューの描画をカスタマイズしたい場合は、カスタムスタイルを実装する必要があります。詳しくはQStyle クラスのドキュメントを参照してください。

Delegate Classes,QItemDelegate,QAbstractItemDelegate,QStyle,Star Delegate Exampleも参照してください

メンバ関数のドキュメント

[explicit] QStyledItemDelegate::QStyledItemDelegate(QObject *parent = nullptr)

与えられたparent で項目デリゲートを構築する。

[virtual noexcept] QStyledItemDelegate::~QStyledItemDelegate()

項目デリゲートを破棄します。

[override virtual] QWidget *QStyledItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const

再インプリメント:QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const.

編集のためにindex で指定されたアイテムを編集するために使用されるウィジェットを返します。parent ウィジェットとスタイルoption は、エディタウィジェットの表示方法を制御するために使用されます。

QAbstractItemDelegate::createEditor()も参照してください

[virtual] QString QStyledItemDelegate::displayText(const QVariant &value, const QLocale &locale) const

この関数は、デリゲートがモデルのQt::DisplayRole を表示するために使用する文字列をlocale に返します。value は、モデルが提供するQt::DisplayRole の値です。

デフォルトの実装では、valueQString に変換するためにQLocale::toString を使用します。

この関数は、空のモデルインデックス、つまりモデルが無効なQVariant を返すインデックスに対しては呼び出されません。

QAbstractItemModel::data()も参照してください

[override virtual protected] bool QStyledItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)

再実装:QAbstractItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)。

[override virtual protected] bool QStyledItemDelegate::eventFilter(QObject *editor, QEvent *event)

再インプリメント:QObject::eventFilter(QObject *watched, QEvent *event)。

与えられたeditor が有効なQWidget であり、与えられたevent が処理される場合はtrue を返し、そうでない場合はfalse を返します。デフォルトでは、以下のキー押下イベントが処理される:

  • Tab
  • Backtab
  • Enter
  • Return
  • Esc

editor のタイプがQTextEdit またはQPlainTextEdit の場合、TabBacktabEnterReturn のキーは処理されない

TabBacktabEnterReturn キー押下イベントの場合、editor のデータはモデルにコミットされ、エディタは閉じられます。eventTab キー押下の場合、ビューはビュー内の次のアイテムのエディタを開きます。同様に、eventBacktab キーの押下である場合、ビューはビューの前のアイテムのエディタを開きます。

イベントがEsc キー押下イベントの場合、editor はデータをコミットせずに閉じられます。

commitData() とcloseEditor()も参照してください

[virtual protected] void QStyledItemDelegate::initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index) const

インデックスindex を使用した値でoption を初期化します。このメソッドは、サブクラスがQStyleOptionViewItem を必要とするが、すべての情報を自分で入力したくない場合に便利です。

QStyleOption::initFrom()も参照してください

QItemEditorFactory *QStyledItemDelegate::itemEditorFactory() const

アイテムデリゲートが使用するエディタファクトリを返します。エディタファクトリが設定されていない場合、この関数は null を返します。

setItemEditorFactory() も参照して ください。

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

再実装:QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const.

index で指定されたアイテムに対して、与えられたpainter とスタイルoption を使用してデリゲートをレンダリングします。

この関数は、ビューのQStyle を使用してアイテムをペイントします。

サブクラスで paint を再実装する場合。QStyledItemDelegate と同じようにoption を設定するにはinitStyleOption() を使用します。

ペイント中は、可能な限りoption を使用してください。特にそのrect 変数で描画する場所を決定し、state で有効か選択されているかを判断します。

描画が終わったら、ペインターをこの関数が呼ばれたときの状態に戻すようにしてください。例えば、描画前にQPainter::save() を呼び出し、描画後にQPainter::restore() を呼び出すと便利です。

QItemDelegate::paint(),QStyle::drawControl(),QStyle::CE_ItemViewItemも参照

[override virtual] void QStyledItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const

を参照してください:QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const.

モデルindex によって指定されたデータモデル項目から、editor によって表示および編集されるデータを設定します。

デフォルトの実装では、editor ウィジェットのユーザ・プロパティにデータを格納します。

QMetaProperty::isUser()も参照してください

void QStyledItemDelegate::setItemEditorFactory(QItemEditorFactory *factory)

アイテムデリゲートによって使用されるエディタファクトリを、指定されたfactory に設定します。エディタ工場が設定されていない場合、アイテムデリゲートはデフォルトのエディタ工場を使用します。

itemEditorFactory() も参照して ください。

[override virtual] void QStyledItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const

再実装:QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const.

editor ウィジェットからデータを取得し、指定されたmodel の項目index に格納します。

デフォルトの実装では、editor ウィジェットのユーザ・プロパティからデータモデルに格納する値を取得します。

QMetaProperty::isUser()も参照してください

[override virtual] QSize QStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const

再実装:QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const.

option によって提供されたスタイル情報を考慮して、index によって指定されたアイテムを表示するためにデリゲートによって必要とされるサイズを返します。

この関数は、ビューのQStyle を使用してアイテムのサイズを決定します。

QStyle::sizeFromContents() およびQStyle::CT_ItemViewItemも参照してください

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

再実装:QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const.

指定されたスタイルoption に従って、index で指定されたアイテムのeditor を更新します。

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