Показать другие данные в QTableView с QItemDelegate - PullRequest
6 голосов
/ 06 января 2010

У меня есть QTableView, связанный с QSqlTableModel.
В первом столбце есть только даты в этом формате: 2010-01-02
Я хочу, чтобы в этом столбце отображалась дата в этом формате (но без изменения реальных данных): 02.01.2010
Я знаю, что должен создать QItemDelegate для этого столбца, но я не знаю, как я могу прочитать существующие данные и перезаписать их чем-то другим. Ты хоть представляешь, как с этим справиться?

Ответы [ 2 ]

15 голосов
/ 17 февраля 2010

Самое простое решение - создать QStyledItemDelegate подкласс и переопределить displayText(...) т.е.

class DateFormatDelegate : public QStyledItemDelegate
{
public:
 DateFormatDelegate (QString dateFormat, QObject *parent = 0) : 
  QStyledItemDelegate(parent),
  m_dateFormat(dateFormat)
 {
 }

 virtual QString displayText(const QVariant & value, const QLocale & locale ) const
 {
  Q_UNUSED(locale);
  return value.toDate().toString(m_dateFormat);
 }

private:
 QString m_dateFormat;
};

Тогда, на ваш взгляд -

setItemDelegateForColumn(/*date column*/, new DateFormatDelegate("MM.dd.yyyy", this));
4 голосов
/ 06 января 2010

Делегат элемента не обязательно изменяет данные, он просто отображает данные. Кроме того, если вы используете Qt 4.4 или новее, посмотрите вместо этого на QStyledItemDelegate - он поддерживает темы и будет выглядеть лучше.

В этой статье есть пример делегатов предметов (который, кажется, является зеркалом официальной документации, которая сейчас не работает или исчезла).

Поскольку все, что вы действительно хотите сделать, это настроить текст, рассматривали ли вы вместо этого использование прокси-модели и просто возвращаете свою собственную строку QString для DisplayRole столбца даты?

...