Задать вопрос
@014

Почему неправильно отображает дату через QSqlTableModel?

Не могу понять почему неправильно отдает дату сохраненную в БД SqlLite через QSqlTableModel. Нужно что бы дата была в формате dd.mm.yyyy, а показывает yyyy.mm.dd.

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

Переопределение делегата DateEdit:
DateEditDelegate::DateEditDelegate(QObject *parent)
    : QItemDelegate(parent){}

QWidget *DateEditDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/*option*/,
    const QModelIndex &/*index*/) const
{

    QDateEdit *date = new QDateEdit(parent);
    date->setFrame(false);
    date->setMinimumDate(QDate(2015, 12, 01));
    date->setMaximumDate(QDate(2099, 12, 01));
    date->setDate(QDate::currentDate());
    date->setCalendarPopup(true);
    date->setDisplayFormat(dateFormat);
    return date;
}

void DateEditDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QDate value = index.model()->data(index, Qt::EditRole).toDate();
    QDateEdit *date = static_cast<QDateEdit*>(editor);
    date->setDate(value);
}

void DateEditDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QDateEdit *date = static_cast<QDateEdit*>(editor);
    date->interpretText();
    model->setData(index, date->date(), Qt::EditRole);
}

void DateEditDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const
{
    editor->setGeometry(option.rect);
}

void DateEditDelegate::paint(QPainter *painter,
                                   const QStyleOptionViewItem &option,
                                   const QModelIndex &index) const
{    
    QStyleOptionViewItemV2 opt = setOptions(index, option);
    opt.displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
    drawDisplay(painter, opt, opt.rect, index.data(Qt::DisplayRole).toDate().toString(dateFormat));


Модель для фильтрации назначаем на QTableView:
pModelProxyFilter = new QSortFilterProxyModel;
pTableView->setModel(pModelProxyFilter);


Назначение делегата на колонку с датой:
pTableView->setItemDelegateForColumn(1, pDateDelegate);


Потом делаю вот так:
qDebug() << pModelProxyFilter->data(pModelProxyFilter->index(2,1), Qt::DisplayRole).toString();

И получаю дату в формате yyyy.mm.dd. Почему так происходит? Ведь делегат переопределен.
  • Вопрос задан
  • 772 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
Demonist
@Demonist
qDebug() << pModelProxyFilter->data(pModelProxyFilter->index(2,1), Qt::DisplayRole).toDate().toString("dd.MM.yyyy");

Метод data возвращает QVariant и делегат никак не влияет на его содержимое т.к. возвращается значение из вашей модели.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы