Название: 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, Исправил на: Код: void WDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, И с интересом увидел, что дата теперь в формате 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")??? |