Usando un delegado con un QDatawidgetMapper y QLabel -- qt camp Relacionados El problema

Using a delegate with a QDataWidgetMapper and QLabel


2
vote

problema

Español

Estoy tratando de usar un delegado para personalizar la forma en que se muestra los datos de un modelo cuando se usa un QDataWidgetMapper.

Tengo dos versiones diferentes de un widget, una es solamente (los datos se muestran en QLabels) y el otro se usa para editar los datos (los datos se muestran en los editores apropiados).

Este último funciona perfectamente con el delegado, todo está bien.

Como puede haber adivinado, el problema surge con el primero ... Al asignar las secciones de mi modelo a QLabels utilizando el QDataWidgetMapper, el delegado nunca se llama y los datos se muestran correctamente para las secciones con datos regulares (cadenas , ints, ...), pero no se muestran datos para las secciones de mi modelo con un tipo de datos personalizado (un tipo de lista) que me gustaría formatear como una cadena usando el delegado.

Ya he realizado esta operación con éxito cuando se muestran los mismos datos en un QTableView (la pintura del método () del delegado se llama cuando se muestran los datos).

Después de haberlo visto un poco más cerca, he podido ver que, cuando use QLabels para mostrar los datos, nunca se llama al delegado, aunque he asociado explícitamente a un delegado al QDatawidGetmapper utilizando su método SetItemDelegate ().

Así que en síntesis, asume una clase CustomItemDelegate que hereda QStyleditemDelegate con métodos virtuales:

  void CustomItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {     qDebug() << "DELEGATE: PAINT" << index.column();     QStyledItemDelegate::paint(painter, option, index); }  void CustomItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {     qDebug() << "DELEGATE: SET EDITOR DATA" << index.column();     QStyledItemDelegate::setEditorData(editor, index); }   

y un widget con seguirlo:

  QDataWidgetMapper* mapper = new QDataWidgetMapper(); CustomItemDelegate* delegate = new CustomItemDelegate(); mapper->setModel(model); mapper->setItemDelegate(delegate);  mapper->addMapping(editorWidget, 1); mapper->addMapping(label, 2, "text");  mapper->toFirst();  QTableView* view = new QTableView(); CustomItemDelegate* delegate2 = new CustomItemDelegate(); view->setModel(model); view->setItemDelegate(delegate2);   

Las salidas de código:

  DELEGATE: SET EDITOR DATA 1 // NOTHING ?!  DELEGATE: PAINT 1 DELEGATE: PAINT 2   

y como resultado, tengo

  • Mi editorwidget con los datos correctos en él (independientemente de cualquier tipo de datos, la sección contiene: regular o personalizada, siempre que el editor maneja el tipo de curso),
  • Mi etiqueta muestra los datos si la sección contiene un tipo regular de los datos, ya que el delegado no se llama
  • Mi opinión mostraría todo bien como se llama al delegado por cada sección

Así que mis preguntas son:

  • ¿Por qué no se llama el delegado cuando el widget mapeo es un Qlabel?
  • En este caso, ¿por qué se muestran los datos incluso cuando el tipo de datos es regular? Magia?

Muchas gracias y me disculpo por adelantado si la respuesta es obvia (pero incluso entonces, gracias por señalarlo: P),

ixm

Original en ingles

I'm trying to use a delegate to customize the way data from a model is displayed when using a QDataWidgetMapper.

I have two different versions of a widget, one is view-only (the data is displayed in QLabels) and the other is used to edit the data (the data is displayed in appropriate editors).

The latter one works perfectly with the delegate, everything is fine.

As you may have guessed the problem arises with the first one... When mapping the sections of my model to QLabels using the QDataWidgetMapper, the delegate is never called and the data is displayed correctly for the sections with regular data (strings, ints,...) but no data is displayed for the sections of my model with a custom data type (a kind of list) which I would like to format as a string using the delegate.

I've already performed this operation successfully when the same data is displayed in a QTableView (the method paint() of the delegate is called when the data is displayed).

After having looked at it a little bit closer, I've been able to see that, when using QLabels to display the data, the delegate is never called though I've explicitly associated a delegate to the QDataWidgetMapper using its method setItemDelegate().

So in synthesis, assume a class CustomItemDelegate which inherits QStyledItemDelegate with virtual methods:

void CustomItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {     qDebug() << "DELEGATE: PAINT" << index.column();     QStyledItemDelegate::paint(painter, option, index); }  void CustomItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const {     qDebug() << "DELEGATE: SET EDITOR DATA" << index.column();     QStyledItemDelegate::setEditorData(editor, index); } 

and a widget with following in it:

QDataWidgetMapper* mapper = new QDataWidgetMapper(); CustomItemDelegate* delegate = new CustomItemDelegate(); mapper->setModel(model); mapper->setItemDelegate(delegate);  mapper->addMapping(editorWidget, 1); mapper->addMapping(label, 2, "text");  mapper->toFirst();  QTableView* view = new QTableView(); CustomItemDelegate* delegate2 = new CustomItemDelegate(); view->setModel(model); view->setItemDelegate(delegate2); 

the code outputs:

DELEGATE: SET EDITOR DATA 1 // NOTHING ?!  DELEGATE: PAINT 1 DELEGATE: PAINT 2 

and as a result I got

  • my editorWidget with the correct data in it (whatever data type the section contains: regular or custom, as long as the editor handles the type of course),
  • my label only displays the data if the section contains a regular type of the data as the delegate is not called
  • my view would display everything fine as the delegate is called for each section

So my questions are:

  • why isn't the delegate called when the mapped widget is a QLabel?
  • in this case, how come the data is even displayed when the data type is regular? Magic?

Thanks very much and I apologize in advance if the answer is obvious (but even then, thank you for pointing it out :P),

ixM

  

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Este es el código de qt que llena widgets

  void QDataWidgetMapperPrivate::populate(WidgetMapper &m) {     if (m.widget.isNull())         return;      m.currentIndex = indexAt(m.section);     if (m.property.isEmpty())         delegate->setEditorData(m.widget, m.currentIndex);     else         m.widget->setProperty(m.property, m.currentIndex.data(Qt::EditRole)); }   

En el primer caso cuando no especifique un delegado de la propiedad, mientras que en el segundo caso, los datos se configuran en Widget directamente pasando su delegado .

No sé por qué fue diseñado de esta manera, pero así es como funciona actualmente!

 

This is the code from QT that populates widgets

void QDataWidgetMapperPrivate::populate(WidgetMapper &m) {     if (m.widget.isNull())         return;      m.currentIndex = indexAt(m.section);     if (m.property.isEmpty())         delegate->setEditorData(m.widget, m.currentIndex);     else         m.widget->setProperty(m.property, m.currentIndex.data(Qt::EditRole)); } 

In the first case when you do not specify a property delegate is used whereas in the second case the data is set to widget directly by passing your delegate.

I don't know why it was designed this way but this is how it works currently !

 
 
 
 

Relacionados problema

0  Qt usando std :: use_facet con wstring  ( Qt using stduse facet with wstring ) 
Necesito código transversal para saltar los espacios principales para una cadena amplia. Está buscando que G ++ (y qt obviamente) no inicialice las ranuras pa...

24  Obtenga el sistema operativo actual durante el tiempo de ejecución en C ++  ( Get the current operating system during runtime in c ) 
Necesito averiguar el sistema operativo Mi programa se está ejecutando durante el tiempo de ejecución. Estoy usando QT 4.6.2, MINGW y Eclipse con CDT. Mi pr...

14  Programación de puerto QT y Puerto Serial [CERRADO]  ( Qt and serial port programming ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

16  Filas seleccionadas en QtableView, Copiar a QClipboard  ( Selected rows in qtableview copy to qclipboard ) 
Tengo una base de datos SQLITE y lo hice en un QSqlTableModel . Para mostrar la base de datos, pongo ese modelo en un QTableView . Ahora quiero crear un m...

4  ¿Cuántos hilos crean qt para trabajar en el fondo?  ( How many threads does qt create to work in the background ) 
Yo uso mucho qt. Quiero saber algo: ¿Cuántos hilos crea QT a las cosas en el fondo? Como manipulación de señales y tragamonedas. Además, cualquier kit de he...

0  Insertar aplicación externa en Windows  ( Embed external application under windows ) 
Tengo una aplicación de escritorio de Windows con la que quiero agregar alguna funcionalidad. Desafortunadamente, el código fuente no está disponible, pero ti...

1  ¿Alguien sabe de un widget para un kit de herramientas de escritorio (GTK, QT, WX) para mostrar un mapa de los Estados Unidos? [cerrado]  ( Does anyone know of a widget for a desktop toolkitgtk qt wx for displaying a ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...

3  ¿Es QT Visual Studio Add-in un subconjunto de la integración QT Visual Studio? [duplicar]  ( Is qt visual studio add in a subset of qt visual studio integration ) 
Esta pregunta ya tiene respuestas aquí : ¿Cuál es la diferencia en las herramientas de integración d...

2  Ventana personalizada QT  ( Qt custom window ) 
Perdóname, soy un novato :) ¿Es posible en QT crear una ventana personalizada sin bordes, pero aún arrastra sin mantener la tecla Alt? Creé una ventana sin ...

4  ¿Cómo puedo configurar los archivos de LookandFeel en Java?  ( How can i setup lookandfeel files in java ) 
Necesito configurar los archivos de LookandFeel en JDK 1.6. Tengo dos archivos: napkinlaf-swingset2.jar napkinlaf.jar ¿Cómo puedo configurar esto ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos