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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отобразить QDateTime в TableView  (Прочитано 5186 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« : Апрель 02, 2014, 23:55 »

Есть TableView с колонкой, где нужно показывать время из модели. Из модели возвращается время в формате UTC:

Код
C++ (Qt)
QVariant MyModel::data(const QModelIndex &index, int role) const
{
   switch(role)
   {
       case ColumnTimestampRole: return QDateTime::fromMSecsSinceEpoch(...).toUTC();
   ...
   }
   ...
}

qDebug возвращаемого значения показывает корректное время в формате UTC. Отображать в таблице нужно в точности то, что приходит из модели, то есть время в формате UTC. Для колонки установлен делегат, который показывает время в формате "yyyy MM dd hh:mm". Но в таблице это время  конвертируется в локальное. Т.е. UTC время "20:01:11" пришедшее из модели показывается как "23:01:11". Как быть?
« Последнее редактирование: Апрель 03, 2014, 00:11 от Alex Custov » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Апрель 03, 2014, 04:01 »

наверное установить свой делегат
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #2 : Апрель 03, 2014, 04:02 »

Ну тут 2 варианта:
1. Починить делегат. (чего он там делает и как написан - не известно.)
2. Почему не сделать:
    return QDateTime::fromMSecsSinceEpoch(...).toUTC().toString("yyyy MM dd hh:mm");
    И не мучить делегат. Это справедливо только для отображения, но если делегат
    собирается его редактировать то только см. п. 1.
« Последнее редактирование: Апрель 03, 2014, 04:19 от vbv » Записан
vbv
Чайник
*
Offline Offline

Сообщений: 59


Просмотр профиля
« Ответ #3 : Апрель 03, 2014, 04:31 »

И еще: где вы взяли такую role?Непонимающий
Constant   Value   Description
Qt::DisplayRole   0   The key data to be rendered in the form of text. (QString)
Qt::DecorationRole   1   The data to be rendered as a decoration in the form of an icon. (QColor, QIcon or QPixmap)
Qt::EditRole   2   The data in a form suitable for editing in an editor. (QString)
Qt::ToolTipRole   3   The data displayed in the item's tooltip. (QString)
Qt::StatusTipRole   4   The data displayed in the status bar. (QString)
Qt::WhatsThisRole   5   The data displayed for the item in "What's This?" mode. (QString)
Qt::SizeHintRole   13   The size hint for the item that will be supplied to views. (QSize)

Тут конструкция должна выглядеть как:
    switch(role)
    {
      Qt::DisplayRole: ...............................   // тут может быть любая
                                                                   // из приведенные выше
                                                                   // ролей
А в Вашем случае, в конце switch стоит некий default который и отображает у Вас конвертированное значение или при не совпадении ни одной роли при выполнении до конца происходит вызов виртуального метода предка и возврат значения из него.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Апрель 03, 2014, 11:22 »

наверное установить свой делегат

делегат уже стоит
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Апрель 03, 2014, 11:25 »

Ну тут 2 варианта:
1. Починить делегат. (чего он там делает и как написан - не известно.)

Как? Делегат просто выводит текст в виде Qt.formatDateTime(styleData.value, "yyyy MM dd hh:mm");

2. Почему не сделать:
    return QDateTime::fromMSecsSinceEpoch(...).toUTC().toString("yyyy MM dd hh:mm");

Потому что из модели приходит дата/время, которое потом используется ещё в других местах. Использование строки вместо QDateTime приведёт к костылям в нескольких местах.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Апрель 03, 2014, 11:28 »

И еще: где вы взяли такую role?Непонимающий

В QML это работает не так как в C++. У каждой колонки есть своя кастомная роль, которую ты и используешь. Список ролей ты задаешь в http://qt-project.org/doc/qt-5.1/qtcore/qabstractitemmodel.html#roleNames
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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