Qt模型/查看授权:如何简单地翻译文本数据?

时间:2011-07-09 17:06:33

标签: c++ windows qt

我使用 QSqlTableModel 作为数据源,使用 QTableView 来显示数据。 我还使用 QDataWidgetMapper 以单独的形式编辑数据。

我想要做的就是将日期/时间字符串从数据库中的一种格式(2011-07-09T18:21:49)转换为另一种格式,以便在表格(18:21)中显示,另一种格式为编辑器映射(09.07.2011 18:21:49)

我认为ItemDelegate是正确的方式,但我不想改变绘画等......我该如何正确地做到这一点?

3 个答案:

答案 0 :(得分:2)

好的我认为这可能是正确的方法(中间数据模型), 但现在我使用了QItemDelegate。 我做了以下工作并且有效:

class DateTimeDelegate : public QItemDelegate
{
Q_OBJECT
public:
explicit DateTimeDelegate(QObject *parent = 0);

void setEditorData(QWidget *editor,
                   const QModelIndex &index) const;

void setModelData(QWidget *editor,
                  QAbstractItemModel *model,
                  const QModelIndex &index) const;

void paint(QPainter *painter, const QStyleOptionViewItem &option,
           const QModelIndex &index) const;

signals:

public slots:

};

实现:

void DateTimeDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    if(index.column() == 1 || index.column() == 2)  {
        if (editor->property("text").isValid()) {
            QDateTime dt = QDateTime::fromString(index.data().toString(), Qt::ISODate);
            editor->setProperty("text", dt.toString("dd.MM.yyyy hh:mm"));
        }
    } else {
        QItemDelegate::setEditorData(editor, index);
    }
}

void DateTimeDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
           const QModelIndex &index) const
{
    QDateTime dt = QDateTime::fromString(index.data().toString(), Qt::ISODate);


    QString time;
    if(dt.date() == QDate::currentDate())
        time = dt.toString("hh:mm");
    else
        time = dt.toString("dd.MM.");

    painter->save();
    painter->setClipRect(option.rect);

    drawBackground(painter, option, index);
    drawDisplay(painter, option, option.rect, time);
    drawFocus(painter, option, option.rect);

    painter->restore();
}   

答案 1 :(得分:0)

我认为你必须使用代理数据模型,而不是ItemDelegate

答案 2 :(得分:0)

这个任务就是QIdentityProxyModel文档中使用的示例。这是执行此操作的适当方法。从文档中:

class DateFormatProxyModel : public QIdentityProxyModel
{
  // ...

  void setDateFormatString(const QString &formatString)
  {
    m_formatString = formatString;
  }

  QVariant data(const QModelIndex &index, int role) const override
  {
    if (role != Qt::DisplayRole)
      return QIdentityProxyModel::data(index, role);

    const QDateTime dateTime = sourceModel()->data(SourceClass::DateRole).toDateTime();

    return dateTime.toString(m_formatString);
  }

private:
  QString m_formatString;
};