【问题标题】:Formatting data in a QTableView在 QTableView 中格式化数据
【发布时间】:2011-04-16 18:31:55
【问题描述】:

我正在使用自定义委托在 QTableView 中显示 QDoubleSpinBoxes。这些旋转框以两位小数显示其内容。

我的问题是,我希望 QTableView 在未编辑时也显示带有两位小数的数字(此时它们不在 QDoubleSpinBox 中)。或者,更确切地说,我希望能够为 QTableView 的内容指定一种格式。

我试图继承 QStyledItemDelegate 来覆盖 displayText,但由于一个奇怪的原因它崩溃了。如果我只是将 QItemDelegate 子类化,它就可以正常工作。

我在 Windows 上使用 Qt 4.6.3。

【问题讨论】:

  • 您所描述的应该有效。 (我们也做过类似的事情。)你有更多关于这次崩溃的信息吗?
  • "0xC0000005: 访问冲突写入位置 0x00000018。"崩溃发生在 QBasicAtomicInt::deref 中,但奇怪的是,在堆栈跟踪中,下面的两个调用中,有一个对 QItemDelegate::paint 的调用。但我正在使用 QStyledItemDelegate...

标签: qt qtableview qitemdelegate


【解决方案1】:

我不确定您遇到的例外情况如何。这是一个简单的 QStyledItemDelegate,我们使用它没有问题。也许有什么不同?

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

【讨论】:

    【解决方案2】:

    好吧,我不知道发生了什么,但现在它不再崩溃了。现在它可以工作了。

    为了记录,这是我的 displayText 方法:

    QString sqxSpinBoxDelegate::displayText(const QVariant &value, const QLocale &locale) const
    {
        return locale.toString(value.toDouble(), 'f', Decimals);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多