Question

J'utilise un délégué personnalisé pour afficher QDoubleSpinBoxes dans un QTableView. Ces spinbox afficher leur contenu avec deux décimales.

Mon problème est que je voudrais le QTableView pour afficher également ces chiffres avec deux décimales alors qu'ils ne sont pas en cours d'édition (à quel point ils ne sont pas dans un QDoubleSpinBox). Ou plutôt, je voudrais être en mesure de spécifier un format pour le contenu du QTableView.

J'ai essayé de sous-classe QStyledItemDelegate de passer outre displayText, mais pour une raison étrange, il se bloque. Il fonctionne correctement si je la sous-classe simplement QItemDelegate.

J'utilise Qt 4.6.3, sous Windows.

Était-ce utile?

La solution

Je ne suis pas vraiment sûr de quoi faire de l'exception que vous obtenez. Voici un simple QStyledItemDelegate que nous utilisons sans problème. Peut-être il y a quelque chose de différent?

#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());
}

Autres conseils

Eh bien, je ne sais pas ce qui est arrivé, mais maintenant il ne se bloque plus. Et cela fonctionne maintenant.

Pour mémoire, voici ma méthode displayText:

QString sqxSpinBoxDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    return locale.toString(value.toDouble(), 'f', Decimals);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top