Russian Qt Forum

Qt => Qt Quick => Тема начата: Alex Custov от Апрель 02, 2014, 23:55



Название: Отобразить QDateTime в TableView
Отправлено: Alex Custov от Апрель 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". Как быть?


Название: Re: Отобразить QDateTime в TableView
Отправлено: kambala от Апрель 03, 2014, 04:01
наверное установить свой делегат


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


Название: Re: Отобразить QDateTime в TableView
Отправлено: vbv от Апрель 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 который и отображает у Вас конвертированное значение или при не совпадении ни одной роли при выполнении до конца происходит вызов виртуального метода предка и возврат значения из него.


Название: Re: Отобразить QDateTime в TableView
Отправлено: Alex Custov от Апрель 03, 2014, 11:22
наверное установить свой делегат

делегат уже стоит


Название: Re: Отобразить QDateTime в TableView
Отправлено: Alex Custov от Апрель 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 приведёт к костылям в нескольких местах.


Название: Re: Отобразить QDateTime в TableView
Отправлено: Alex Custov от Апрель 03, 2014, 11:28
И еще: где вы взяли такую role????

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