Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Rikland от Апрель 26, 2011, 21:48



Название: MVC + QItemDelegate: paint
Отправлено: Rikland от Апрель 26, 2011, 21:48
Доброго времени суток.

Есть связка Model+View = наследник от QSqlQueryModel + стандартный QTableView. В модели переопределен метод data(), данные отображаются определенным образом (в зависимости от типа данных в ячейке): дата в формате dd.MM.yyy, время hh:mm и все по центру, числа выравнены по правому краю, текст - по левому, и др.

Понадобилось добавить возможность редактирования в ячейках. Унаследовался от QItemDelegate, опять же в зависимости от типа данных создаю свой editor, все нормально работает.

Не сразу и заметил, что в режиме просмотра (не редактирования) все красивое отображение пропало: дата в виде dd.MM.yy, у времени появились ненужные мне секунды.

Смотрю метод делегата paint:

Код:
void WDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const {

    ... // определение типа поля в ячейке

    if (fieldType == "bool") {
        // здесь все нормально
    } else {
        QItemDelegate::paint(painter, opt, index); // думал, этого достаточно для нормального отображения :(
    }
}

Исправил на:

Код:
void WDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const {

    ... // определение типа поля в ячейке

    if (fieldType == "bool") {
        // здесь все нормально
    } else {
        if (option.state & QStyle::State_Selected) return;
        QString aText = index.model()->data(index, Qt::EditRole).toString();
       
        painter->drawText(
            QRect(option.rect.left()+1,option.rect.top(),option.rect.width(),option.rect.height()),
            Qt::AlignLeft | Qt::AlignVCenter,
            aText
        );

        QItemDelegate::paint(painter, option, index);
    }
}

И с интересом увидел, что дата теперь в формате yyyy-MM-dd, вместо QDateTime вообще невесть чего... Такое ощущение, что код index.model()->data(index, Qt::EditRole).toString(); возвращает не данные моей модели, а вообще невесть чего...

Кто объяснит, где я накосячил?


Название: Re: MVC + QItemDelegate: paint
Отправлено: asvil от Апрель 27, 2011, 08:53
Во-первых, в документации ясно написано, наследоваться надо от QStyledItemDelegate. Конечно, возможно у Вас свои причины не делать этого.
Во-вторых model::data вернет QVariant. QVariant::toString превратит что-то в строку по своему алгоритму. Для DateTime это iso\d{4}.

Вот Вам плохой совет исследуйте QLocale::toString.
Вот Вам хороший - возьмите исходники QStyledItemDelegate, скопируйте полностью и перепилите под свои нужды.


Название: Re: MVC + QItemDelegate: paint
Отправлено: Rikland от Апрель 27, 2011, 23:21
Насчет использования QStyledItemDelegate... надо посмотреть, возможно, так действительно будет лучше. Спасибо!

А вот насчет

Цитировать
Во-вторых model::data вернет QVariant. QVariant::toString превратит что-то в строку по своему алгоритму.

Непонятно. Если у меня в model::data ПЕРЕОПРЕДЕЛЕНО, что возвращать для роли Qt::EditRole (в частности - для даты я возвращаю QString = "dd.MM.yyyy"), то разве код вида index.model()->data(index, Qt::EditRole) не должен мне вернуть QVariant(QString, "dd.MM.yyyy")???