2

我正在尝试让 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 “更多”,因为它的第一个数字更大。

有没有一种优雅的方式来进行排序?

4

2 回答 2

4
  • 调用“setData”设置item的数据时,直接设置qQTime对象
  • 子类 QItemDelegate 并通过简单地绘制文本来处理显示,必要时覆盖 sizeHint
  • 调用 QAbstractItemView::setItemDelegateForColumn 为持续时间列设置您的委托。

通过这种方法,您可以使用您的方法显示您的 QTime 数据,并正确排序。

于 2010-07-28T08:31:52.053 回答
1

我对已接受答案的实现 [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);
}
于 2010-08-01T08:03:13.253 回答