Russian Qt Forum

Qt => Model-View (MV) => Тема начата: sinbad7 от Октябрь 10, 2011, 13:09



Название: Делегат для даты
Отправлено: sinbad7 от Октябрь 10, 2011, 13:09
Создаю делегата для даты
datdelegate.cpp
Код:
#include <QtGui>

#include "datdelegate.h"
datDelegate::datDelegate(QObject *parent)
    : QItemDelegate(parent)
{
}
QWidget *datDelegate::createEditor(QWidget *parent,
    const QStyleOptionViewItem &/* option */,
    const QModelIndex &/* index */) const
{
    QDateEdit *editor = new QDateEdit(parent);
    editor->setDisplayFormat("dd.MM.yy");
    return editor;
}
void datDelegate::setEditorData(QWidget *editor,
                                    const QModelIndex &index) const
{
    QDate value = index.model()->data(index, Qt::EditRole).toDate();

    QDateEdit *dateEdit = static_cast<QDateEdit*>(editor);
    dateEdit->setDate(value);
}
void datDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
                                   const QModelIndex &index) const
{
    QDateEdit *dateEdit = static_cast<QDateEdit*>(editor);
    QDate value = dateEdit->date();
    model->setData(index, value, Qt::EditRole);
}
void datDelegate::updateEditorGeometry(QWidget *editor,
    const QStyleOptionViewItem &option, const QModelIndex &/* index */) const
{
    editor->setGeometry(option.rect);
}

QString datDelegate::displayText(const QVariant &value, const QLocale &locale) const
{

    return locale.toString(value.toDate(), "dd:MM:yy");

}

и в результате получаю
до редактирования вид YYYY-MM-DD
при редактировании DD.MM.YY
после редактирования DD.MM.YYYY
после сохранения опять YYYY-MM-DD


Название: Re: Делегат для даты
Отправлено: Bepec от Октябрь 10, 2011, 13:31
Кхм это конечно хорошо, что делегат. А проблема простая - у тебя в таблице установлен такой вид даты :) переставь его чоле, в QDataTime  вроде можно маску задавать типо yy.mm.dd как душа пожелает.

PS там одно и то же значение, просто представление у тебя разное :)


Название: Re: Делегат для даты
Отправлено: Rem Norton от Октябрь 10, 2011, 13:44
Делал для одной поделки делегата (см. аттач), подобных трудностей не возникло.

P.S. Он там сразу на кучу типов, в том числе и QDatetTime. Думаю разберешься.


Название: Re: Делегат для даты
Отправлено: sinbad7 от Октябрь 11, 2011, 04:32
Для REM, там у тебя только Editor создается, а у меня он и так нормально работает, у меня DisplayText не так показывает.

Для Верес, таблица в базе SQLite с помощью SQLTableModel используется в программе, в таблице поле типа DATE, ты предлагаешь поменять его на DATETIME, или я не так понял?
upd: Менял поле в таблице на тип DATETIME, никаких изменений


Название: Re: Делегат для даты
Отправлено: sinbad7 от Октябрь 11, 2011, 05:51
Кхм это конечно хорошо, что делегат. А проблема простая - у тебя в таблице установлен такой вид даты :) переставь его чоле, в QDataTime  вроде можно маску задавать типо yy.mm.dd как душа пожелает.

PS там одно и то же значение, просто представление у тебя разное :)
Для редактирования у меня QDateEdit и он прекрасно отображает дату, как видно при правке, проблема в отображении displayText
Для уточнения, я хотел вывести дату в формате dd.mm.yy
в коде это выглядит так
Код:
QString datDelegate::displayText(const QVariant &value, const QLocale &locale) const
{

    return locale.toString(value.toDate(), "dd:MM:yy");

}
вот этот кусок у меня и не работает


Название: Re: Делегат для даты
Отправлено: Bepec от Октябрь 11, 2011, 08:50
Посмотрю сегоднячто да как( но особой надежды нет ^^).

update: не посмотрел, звиняюсь


Название: Re: Делегат для даты
Отправлено: GreatSnake от Октябрь 12, 2011, 10:40
Код:
QString datDelegate::displayText(const QVariant &value, const QLocale &locale) const
{

    return locale.toString(value.toDate(), "dd:MM:yy");

}
вот этот кусок у меня и не работает
У QItemDelegate нет displayText(), вот он у тебя и не работает. Используй QStyledItemDelegate в качестве базового.
А про QItemDelegate забудь и никогда его не вспоминай. Я вообще не понимаю зачем тролли его оставили. Только путают народ.


Название: Re: Делегат для даты
Отправлено: sinbad7 от Октябрь 12, 2011, 11:05
GreatSnake, спасибо большое. Все работает!