Russian Qt Forum
Ноябрь 23, 2024, 23:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: MVC + QItemDelegate: paint  (Прочитано 3644 раз)
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(); возвращает не данные моей модели, а вообще невесть чего...

Кто объяснит, где я накосячил?
Записан
asvil
Гость
« Ответ #1 : Апрель 27, 2011, 08:53 »

Во-первых, в документации ясно написано, наследоваться надо от QStyledItemDelegate. Конечно, возможно у Вас свои причины не делать этого.
Во-вторых model::data вернет QVariant. QVariant::toString превратит что-то в строку по своему алгоритму. Для DateTime это iso\d{4}.

Вот Вам плохой совет исследуйте QLocale::toString.
Вот Вам хороший - возьмите исходники QStyledItemDelegate, скопируйте полностью и перепилите под свои нужды.
Записан
Rikland
Гость
« Ответ #2 : Апрель 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")Непонимающий
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 21.