@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. Почему так происходит? Ведь делегат переопределен.
  • Вопрос задан
  • 642 просмотра
Решения вопроса 1
Demonist
@Demonist
qDebug() << pModelProxyFilter->data(pModelProxyFilter->index(2,1), Qt::DisplayRole).toDate().toString("dd.MM.yyyy");

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

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

Войти через центр авторизации
Похожие вопросы