Показывать другие данные в QTableView с помощью QItemDelegate
-
19-09-2019 - |
Вопрос
У меня есть QTableView, связанный с QSqlTableModel.
В первом столбце указаны только даты в этом формате: 2010-01-02
Я хочу, чтобы в этом столбце отображалась дата в этом формате (но без изменения реальных данных): 02.01.2010
Я знаю, что мне нужно создать QItemDelegate для этого столбца, но я не знаю, как я могу прочитать существующие данные и перезаписать их чем-то другим.У вас есть какие-нибудь идеи, как с этим справиться?
Решение
Делегат элемента не обязательно изменяет данные, он просто отображает их.Кроме того, если вы используете Qt 4.4 или новее, посмотрите вместо этого на QStyledItemDelegate - он поддерживает тему и будет выглядеть приятнее.
Есть пример делегатов элементов в эта статья (что, по-видимому, является отражением официальной документации, которая сейчас недоступна или исчезла).
Поскольку все, что вы действительно хотите сделать, это настроить текст, рассматривали ли вы возможность использования вместо этого прокси-модели и просто возврата вашей пользовательской QString для DisplayRole столбца даты?
Другие советы
Самое простое решение - создать QStyledItemDelegate
подкласс и переопределение displayText(...)
ie
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));