как отсортировать продолжительность с Qt? - PullRequest
2 голосов
/ 28 июля 2010

Я пытаюсь заставить QSortFilterProxyModel сортировать элементы по продолжительности.

предварительные условия:

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

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

Есть ли элегантный способ сортировки?

Ответы [ 2 ]

4 голосов
/ 28 июля 2010
  • Когда вызывается «setData» для установки данных элемента, задайте объект q QTime напрямую
  • Подкласс QItemDelegate и управляйте отображением, просто рисуя текст, при необходимости переопределяя sizeHint
  • ВызовQAbstractItemView :: setItemDelegateForColumn для установки вашего делегата для столбца продолжительности.

При таком подходе вы можете отображать данные QTime с помощью вашего подхода и правильно сортировать.

1 голос
/ 01 августа 2010

моя реализация принятого ответа [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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...