2010-09-24 42 views
1

J'utilise un délégué personnalisé pour afficher QDoubleSpinBox dans un QTableView. Ces spinbox affichent leur contenu avec deux décimales. Mon problème est que je voudrais que QTableView affiche également ces nombres avec deux décimales pendant qu'ils ne sont pas édités (à quel point ils ne sont pas dans un QDoubleSpinBox). Ou plutôt, j'aimerais pouvoir spécifier un format pour le contenu de QTableView.Mise en forme de données dans un QTableView

J'ai essayé de sous-classer QStyledItemDelegate pour surcharger displayText, mais pour une raison étrange, il se bloque. Cela fonctionne correctement si je sous-classe simplement QItemDelegate. J'utilise Qt 4.6.3, sous Windows.

+0

Ce que vous décrivez devrait fonctionner. (Nous avons fait des choses similaires.) Avez-vous plus d'informations sur l'accident? –

+0

"0xC0000005: violation d'accès d'écriture emplacement 0x00000018." Le crash se produit dans QBasicAtomicInt :: deref, mais la chose étrange est que, dans la trace de la pile, deux appels ci-dessous, il y a un appel à QItemDelegate :: paint. Mais j'utilise QStyledItemDelegate ... –

Répondre

1

Je ne suis pas vraiment sûr de quoi faire de l'exception que vous obtenez. Voici un QStyledItemDelegate simple que nous utilisons sans problèmes. Peut-être qu'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()); 
} 
+0

Là, pourrait aussi bien l'accepter parce que vous avez aidé. –

0

Eh bien, je ne sais pas ce qui s'est passé, mais maintenant il ne se bloque plus. Et ça marche 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); 
}