2010-01-26 13 views
9

Tengo el siguiente problema con QT model/view framework. Quiero presentar un widget dentro de un elemento de vista de tabla.¿Cómo renderizar un widget complejo dentro de un elemento de vista de árbol en QT?

Primero mi pensamiento era utilizar

void QAbstractItemView::setIndexWidget(const QModelIndex & index, QWidget * widget) 

Pero la documentación para esta función declara explícitamente:

Esta función sólo se debe utilizar para el contenido estático pantalla dentro del área visible correspondiente a un artículo de datos. Si desea mostrar el contenido dinámico personalizado o implementar un widget de editor personalizado , en su lugar, subclase QItemDelegate .

Por lo tanto, proponen utilizar delegados aquí. Bueno, hasta ahora todo bien. Sé que los delegados pueden usarse para crear un editor, que puede ser básicamente cualquier widget de QT. Pero aquí está el problema - No quiero que este widget sea un editor - Quiero renderizar el elemento con este widget siempre. Y no solo "renderizar", necesito que tenga el comportamiento exacto del widget.

Ahora el widget que quiero usar es un widget personalizado, que es un contenedor de algunos otros widgets (algunas casillas de verificación, algunos botones con algún diseño).

La solución que considero es la siguiente:

  1. Grab el aspecto de mi widget personalizado a un mapa de píxeles.
  2. Deje que el delegado se pinta utilizando este mapa de píxeles.
  3. Cuando el ratón está sobre un elemento provocará que la vista para iniciar automáticamente la edición (no me
    sé cómo hacerlo todavía, pero supongo que es posible)
  4. Vamos al delegado crear mi aparato como el editor de un artículo.

Esta solución parece funcionar, pero huele mal para mí. ¿Alguien puede pensar en una solución más elegante para este problema?

Gracias.

+0

¿Qué quiere decir con "Necesito tener el comportamiento exacto del widget? –

+0

Quiero interactuar con el usuario - para reaccionar en sus acciones – Lev

+0

¿Qué tipo de interacciones desea?" Cada celda es exactamente eso, una célula. No es un artilugio, así que estoy teniendo dificultades para imaginar lo que realmente quieres en el camino de las interacciones. –

Respuesta

7

Delegates están a cargo de creating editors, así como hacer toda la visualización necesaria. Pueden usar estilos para hacer gran parte de la pintura, como dibujar una barra de progreso o pintar manualmente.

Un delegado, sin embargo, no es un widget. A menos que se haya invocado un editor, no tiene acceso a la mayoría de las cosas que un widget. Los dos son muy diferentes, tienen diferentes propósitos y logran cosas diferentes.

Uno de los aspectos más problemáticos de los delegados es que son estáticos. A menos que algo en el modelo active una actualización (o el widget esté configurado para ver eventos de desplazamiento), el delegado no se usará para volver a dibujar los datos que estén presentes: la representación en búfer se dibujará en la pantalla.

Usted tiene cierto control sobre cuándo se invoca un editor con edit triggers, aunque definitivamente puede manejarlo con algún código personalizado, como a través del seguimiento del mouse.

+0

De acuerdo. Así que, básicamente, ¿dices que voy en la dirección correcta? Por cierto, el evento hover no me ayuda aquí, ya que el widget es creado por el delegado solo cuando se activa la edición (antes de que el widget no exista). – Lev

+1

Puede usar composición, mantener una referencia al widget y luego usar 'QWidget :: render() 'dibujar en un mapa de píxeles que está pintado en el método' pintura' del delegado. –

Cuestiones relacionadas