Pregunta

Estoy usando un delegado personalizado para mostrar QDoubleSpinBoxes en un QTableView. Esas casillas numéricas muestran sus contenidos con dos decimales.

Mi problema es que me gustaría que el QTableView para mostrar también esos números con dos decimales, mientras que no se están editando (momento en el que no se encuentran en un QDoubleSpinBox). O, más bien, me gustaría ser capaz de specifiy un formato para el contenido de la QTableView.

He intentado subclase QStyledItemDelegate para anular displayText, pero por una razón extraña que se estrelle. Funciona correctamente si simplemente subclase QItemDelegate.

Estoy usando Qt 4.6.3, en Windows.

¿Fue útil?

Solución

No estoy realmente seguro de qué hacer con la excepción de que está recibiendo. Aquí es un simple QStyledItemDelegate que estamos utilizando sin problemas. Tal vez hay algo diferente?

#include "model_view/color_combo_delegate.h"

#include <QTimer>

#include "map_elements/common/color_combo_box.h"

ColorComboDelegate::ColorComboDelegate(QObject *parent)
  : QStyledItemDelegate(parent) {
}

QWidget *ColorComboDelegate::createEditor(
    QWidget *parent,
    const QStyleOptionViewItem & /*option*/,
    const QModelIndex & /*index*/) const {
  ColorComboBox *color_combo_box = new ColorComboBox(parent);
  connect(color_combo_box, SIGNAL(currentIndexChanged(int)),
          this, SLOT(IndexChanged()));
  QTimer::singleShot(0, color_combo_box, SLOT(Popup()));
  return color_combo_box;
}

QString ColorComboDelegate::displayText(const QVariant &value,
                                        const QLocale &/*locale*/) const {
  Map::Color color = static_cast<Map::Color>(value.toInt());
  return Map::color_name(color);
}

void ColorComboDelegate::IndexChanged() {
  ColorComboBox *color_combo_box = qobject_cast<ColorComboBox *>(sender());
  emit commitData(color_combo_box);
  emit closeEditor(color_combo_box);
}

void ColorComboDelegate::setEditorData(QWidget * editor,
                                       const QModelIndex & index) const {
  ColorComboBox *color_combo_box = qobject_cast<ColorComboBox *>(editor);
  Map::Color color = static_cast<Map::Color>(index.data().toInt());
  color_combo_box->set_color(color);
}

void ColorComboDelegate::setModelData(QWidget *editor,
                                      QAbstractItemModel *model,
                                      const QModelIndex &index) const {
  ColorComboBox *color_combo_box = qobject_cast<ColorComboBox *>(editor);
  model->setData(index, color_combo_box->color());
}

Otros consejos

Bueno, no sé lo que pasó, pero ahora ya no se bloquea. Y ahora funciona.

Para el registro, este es mi método displayText:

QString sqxSpinBoxDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    return locale.toString(value.toDouble(), 'f', Decimals);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top