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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сортировка по длительности (решено)  (Прочитано 4207 раз)
theorist
Гость
« : Июль 27, 2010, 20:30 »

здравствуйте!

хочу заставить QSortFilterProxyModel упорядочивать данные по колонке с длительностью (количеством часов, минут и секунд).

ограничения:
1. у минут и часов не должно быть впереди нулей
2. если длительность менее часа, то часы не показывать, а показывать только минуты и секунды
3. если длительность менее минуты, то показывать 0 минут и соответствующее количество секунд

пробовал записывать в модель длительность как H:mm:ss (http://doc.trolltech.com/4.6/qtime.html#toString), если длительность не менее часа, и как m:ss - если менее часа, но, поскольку упорядочивание для QString осуществляется в алфавитном порядке, то, например, длительность 5:20 оказывается больше, чем 12:09, так как первая цифра у неё больше.

как быть? Непонимающий
« Последнее редактирование: Июль 28, 2010, 13:17 от theorist » Записан
BlackTass
Гость
« Ответ #1 : Июль 27, 2010, 21:04 »

либо писать свой компарер, либо просто хранить в численном виде длительность (и сравнивать тоже), а выводить ее уже в преобразованном строковом
Записан
Kolobok
Гость
« Ответ #2 : Июль 27, 2010, 22:42 »

Сохраняй данные в виде QTime.
Записан
theorist
Гость
« Ответ #3 : Июль 28, 2010, 07:29 »

либо писать свой компарер ...
ой, не хочется В замешательстве неужели в самом Qt нет такого средства?
... либо просто хранить в численном виде длительность (и сравнивать тоже), а выводить ее уже в преобразованном строковом
разве при упорядочивании и выводе используется не один и тот же метод data() модели-источника?
Записан
theorist
Гость
« Ответ #4 : Июль 28, 2010, 07:31 »

Сохраняй данные в виде QTime.
да я бы с радостью, только с ним нули впереди выводятся и часы, даже если их нет, а секунды, наоборот, не выводятся, и если локаль, например, американская, то ещё AM в конце добавляется Грустный
« Последнее редактирование: Июль 28, 2010, 07:47 от theorist » Записан
Kolobok
Гость
« Ответ #5 : Июль 28, 2010, 09:28 »

да я бы с радостью, только с ним нули впереди выводятся и часы, даже если их нет, а секунды, наоборот, не выводятся, и если локаль, например, американская, то ещё AM в конце добавляется Грустный

Для этого напиши своего делегата.
Записан
theorist
Гость
« Ответ #6 : Июль 28, 2010, 13:16 »

Для этого напиши своего делегата.
так и сделал (DurationDelegate - подкласс QStyledItemDelegate):
Код:
void DurationDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const {
    Q_ASSERT(index.isValid());
    QStyleOptionViewItemV4 v4option = option;
    initStyleOption(&v4option, index);
    const QWidget *widget;
    const QStyleOptionViewItemV4 *v4 = qstyleoption_cast<const QStyleOptionViewItemV4 *>(&option);
    v4 ? widget = v4->widget : widget = 0;
    QStyle *style = widget ? widget->style() : QApplication::style();
    if (index.model()->data(index, Qt::DisplayRole).type() == QVariant::Time) {
        QTime length = index.model()->data(index, Qt::DisplayRole).toTime();
        QString format;
        length >= QTime(1, 0) ? format = QString("H:mm:ss") : format = QString("m:ss");
        v4option.text = length.toString(format);
    }
    style->drawControl(QStyle::CE_ItemViewItem, &v4option, painter, widget);
}
заработало. спасибо! Улыбающийся
« Последнее редактирование: Август 02, 2010, 09:04 от theorist » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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