En esta página

QAbstractItemDelegate Class

La clase QAbstractItemDelegate se utiliza para mostrar y editar elementos de datos de un modelo. Más...

Cabecera: #include <QAbstractItemDelegate>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
Hereda: QObject
Heredado por:

QItemDelegate y QStyledItemDelegate

Tipos Públicos

enum EndEditHint { NoHint, EditNextItem, EditPreviousItem, SubmitModelCache, RevertModelCache }

Funciones públicas

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

Señales

void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
void commitData(QWidget *editor)
void sizeHintChanged(const QModelIndex &index)

Descripción detallada

Un QAbstractItemDelegate proporciona la interfaz y funcionalidad común para los delegados en la arquitectura modelo/vista. Los delegados muestran elementos individuales en las vistas y manejan la edición de los datos del modelo.

La clase QAbstractItemDelegate es una de las Clases Modelo/Vista y forma parte del framework modelo/vista de Qt.

Para renderizar un ítem de forma personalizada, debes implementar paint() y sizeHint(). La clase QStyledItemDelegate proporciona implementaciones por defecto para estas funciones; si no necesitas renderizado personalizado, subclasea esa clase en su lugar.

Damos un ejemplo de dibujo de una barra de progreso en elementos; en nuestro caso para un programa de gestión de paquetes.

El gestor de paquetes muestra el progreso de la descarga

Creamos la clase WidgetDelegate, que hereda de QStyledItemDelegate. Hacemos el dibujo en la función 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);

Observa que utilizamos un QStyleOptionProgressBar e inicializamos sus miembros. A continuación, podemos utilizar el QStyle actual para dibujarlo.

Para proporcionar edición personalizada, hay dos enfoques que se pueden utilizar. El primer enfoque es crear un widget editor y mostrarlo directamente encima del elemento. Para ello debes reimplementar createEditor() para proporcionar un widget editor, setEditorData() para rellenar el editor con los datos del modelo, y setModelData() para que el delegado pueda actualizar el modelo con los datos del editor.

El segundo enfoque es manejar los eventos de usuario directamente reimplementando editorEvent().

Ver también Programación Modelo/Vista, QStyledItemDelegate, y QStyle.

Documentación de tipos de miembros

enum QAbstractItemDelegate::EndEditHint

Este enum describe las diferentes sugerencias que el delegado puede dar a los componentes del modelo y de la vista para hacer que la edición de datos en un modelo sea una experiencia cómoda para el usuario.

ConstanteValorDescripción
QAbstractItemDelegate::NoHint0No se recomienda realizar ninguna acción.

Estos consejos permiten al delegado influir en el comportamiento de la vista:

ConstanteValorDescripción
QAbstractItemDelegate::EditNextItem1La vista debe utilizar el delegado para abrir un editor en el siguiente elemento de la vista.
QAbstractItemDelegate::EditPreviousItem2La vista debe utilizar el delegado para abrir un editor en el elemento anterior de la vista.

Tenga en cuenta que las vistas personalizadas pueden interpretar los conceptos de siguiente y anterior de forma diferente.

Los siguientes consejos son muy útiles cuando se utilizan modelos que almacenan datos en caché, como los que manipulan datos localmente para aumentar el rendimiento o conservar el ancho de banda de la red.

ConstanteValorDescripción
QAbstractItemDelegate::SubmitModelCache3Si el modelo almacena datos en caché, debe escribir los datos almacenados en caché en el almacén de datos subyacente.
QAbstractItemDelegate::RevertModelCache4Si el modelo almacena datos en caché, debe descartar los datos almacenados en caché y sustituirlos por datos del almacén de datos subyacente.

Aunque los modelos y las vistas deben responder a estas sugerencias de la forma adecuada, los componentes personalizados pueden ignorar alguna o todas ellas si no son relevantes.

Documentación de las funciones miembro

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

Crea un nuevo elemento abstracto delegado con la dirección parent.

[virtual noexcept] QAbstractItemDelegate::~QAbstractItemDelegate()

Destruye el elemento abstracto delegado.

[signal] void QAbstractItemDelegate::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)

Esta señal se emite cuando el usuario ha terminado de editar un elemento utilizando la dirección editor especificada.

hint permite al delegado influir en el comportamiento del modelo y la vista una vez finalizada la edición. Indica a estos componentes qué acción debe realizarse a continuación para proporcionar una experiencia de edición cómoda para el usuario. Por ejemplo, si se especifica EditNextItem, la vista debería utilizar un delegado para abrir un editor en el siguiente elemento del modelo.

Véase también EndEditHint.

[signal] void QAbstractItemDelegate::commitData(QWidget *editor)

Esta señal debe emitirse cuando el widget editor ha terminado de editar los datos, y quiere escribirlos de nuevo en el modelo.

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

Devuelve el editor que se utilizará para editar el elemento de datos con la dirección index. Tenga en cuenta que el índice contiene información sobre el modelo que se está utilizando. El widget padre del editor se especifica en parent, y las opciones del elemento en option.

La implementación base devuelve nullptr. Si desea una edición personalizada tendrá que reimplementar esta función.

El widget editor devuelto debe tener Qt::StrongFocus; de lo contrario, los QMouseEvents recibidos por el widget se propagarán a la vista. El fondo de la vista se reflejará a menos que el editor pinte su propio fondo (por ejemplo, con setAutoFillBackground()).

Véase también destroyEditor(), setModelData() y setEditorData().

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

Se invoca cuando el editor ya no es necesario para editar el elemento de datos con el index dado y debe ser destruido. El comportamiento por defecto es una llamada a deleteLater en el editor. Es posible, por ejemplo, evitar este borrado reimplementando esta función.

Véase también createEditor().

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

Cuando se inicia la edición de un elemento, se llama a esta función con el event que desencadenó la edición, el model, el index del elemento, y el option utilizado para renderizar el elemento.

Los eventos del ratón se envían a editorEvent() aunque no inicien la edición del elemento. Esto puede ser útil, por ejemplo, si se desea abrir un menú contextual cuando se pulsa el botón derecho del ratón sobre un elemento.

La implementación base devuelve false (indicando que no ha gestionado el evento).

[since 6.10] bool QAbstractItemDelegate::handleEditorEvent(QObject *editor, QEvent *event)

Implementa el manejo estándar de eventos en nombre del editor activo en ese momento. Llama a esta función desde una sustitución de eventFilter() en una subclase de QAbstractItemModel, y devuelve su resultado. Para evitar el procesamiento duplicado de eventos, no llame a la implementación de la clase padre de eventFilter() después de llamar a esta función.

Devuelve true si el editor dado es un QWidget válido y el event dado es manejado; en caso contrario devuelve false. Los siguientes eventos de pulsación de tecla se gestionan por defecto:

  • Tab
  • Backtab
  • Enter
  • Return
  • Esc

Si el tipo de editor'es QTextEdit o QPlainTextEdit entonces Tab, Backtab, Enter y Return teclas no son manejadas.

Si se pulsan las teclas Tab, Backtab, Enter y Return, los datos de editor se guardan en el modelo y se cierra el editor. Si event es una pulsación de tecla de Tab, la vista abrirá un editor en el siguiente elemento de la vista. Del mismo modo, si event es una pulsación de tecla de Backtab, la vista abrirá un editor en el elemento anterior de la vista.

Si el evento es una pulsación de tecla de Esc, editor se cierra sin confirmar sus datos.

Esta función se introdujo en Qt 6.10.

Véase también commitData() y closeEditor().

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

Cada vez que se produce un evento de ayuda, se llama a esta función con el event view option y el index que corresponde al elemento en el que se produce el evento.

Devuelve true si el delegado puede manejar el evento; en caso contrario devuelve false. Un valor de retorno verdadero indica que los datos obtenidos mediante el índice tenían la función requerida.

En el caso de los eventos QEvent::ToolTip y QEvent::WhatsThis que se hayan gestionado correctamente, es posible que se muestre la ventana emergente correspondiente en función de la configuración del sistema del usuario.

Véase también QHelpEvent.

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

Esta función abstracta pura debe ser reimplementada si se desea proporcionar un renderizado personalizado. Utiliza painter y el estilo option para renderizar el elemento especificado por el elemento index.

Si reimplementa esto también debe reimplementar sizeHint().

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

Establece el contenido de editor con los datos del elemento en index. Tenga en cuenta que el índice contiene información sobre el modelo que se está utilizando.

La implementación base no hace nada. Si desea una edición personalizada tendrá que reimplementar esta función.

Véase también setModelData().

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

Establece los datos para el elemento en el index dado en el model a los contenidos del editor dado .

La implementación base no hace nada. Si desea una edición personalizada tendrá que reimplementar esta función.

Véase también setEditorData().

[pure virtual] QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const

Esta función abstracta pura debe reimplementarse si se desea proporcionar un renderizado personalizado. Las opciones se especifican en option y el elemento del modelo en index.

Si reimplementa esto también debe reimplementar paint().

[signal] void QAbstractItemDelegate::sizeHintChanged(const QModelIndex &index)

Esta señal debe ser emitida cuando el sizeHint() de index cambiado.

Vistas se conectan automáticamente a esta señal y relayout elementos según sea necesario.

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

Actualiza la geometría del editor para el elemento con el index dado, de acuerdo con el rectángulo especificado en el option. Si el elemento tiene una disposición interna, el editor se dispondrá en consecuencia. Tenga en cuenta que el índice contiene información sobre el modelo que se está utilizando.

La implementación base no hace nada. Si desea una edición personalizada debe reimplementar esta función.

© 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.