Domanda

sto usando un delegato personalizzato per visualizzare QDoubleSpinBoxes in un QTableView. Quei SpinBox visualizzare il loro contenuto con due decimali.

Il mio problema è che vorrei che la QTableView per visualizzare anche quei numeri con due cifre decimali, mentre non vengono modificati (al punto che essi non sono in QDoubleSpinBox). O, meglio, mi piacerebbe essere in grado di specifiy un formato per i contenuti del QTableView.

Ho cercato di sottoclasse QStyledItemDelegate per ignorare displayText, ma per una strana ragione si blocca. Funziona correttamente se ho semplicemente sottoclasse QItemDelegate.

sto usando Qt 4.6.3, su Windows.

È stato utile?

Soluzione

Non sono davvero sicuro di cosa fare di eccezione che si stanno ottenendo. Ecco un semplice QStyledItemDelegate che stiamo usando senza problemi. Forse c'è qualcosa di diverso?

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

Altri suggerimenti

Beh, non so cosa sia successo, ma ora non si blocca più. E ora funziona.

Per la cronaca, questo è il mio metodo displayText:

QString sqxSpinBoxDelegate::displayText(const QVariant &value, const QLocale &locale) const
{
    return locale.toString(value.toDouble(), 'f', Decimals);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top