如何用Qt对持续时间进行排序?

发布于 2024-09-11 12:54:18 字数 468 浏览 15 评论 0原文

我正在尝试使 QSortFilterProxyModel 按持续时间对项目进行排序。

前提条件:

  1. 小时和分钟不能有前导零,
  2. 如果持续时间小于一小时,则不能显示小时,但只有分钟和秒,
  3. 如果持续时间小于一分钟,则必须显示 0 分钟和相应的秒数[0:42]

尝试将源模型中的持续时间存储为 H:mm:ss ( http://doc.trolltech.com/4.6/qtime.html#toString) 如果它们是一小时或更长,则为 m:ss - 如果少于一小时,但由于 QString 的排序是按字母顺序排列的,那么,例如,5:20 比 12:09 “多”,因为它的第一个数字更大。

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

i'm trying to make QSortFilterProxyModel sort items by duration.

preconditions:

  1. hours and minutes must not have leading zeros
  2. if duration is less than an hour, then hours must not be displayed, but only minutes and seconds
  3. if duration is less than a minute, then 0 minutes and the corresponding number of seconds must be displayed [0:42]

tried to store durations in the source model as H:mm:ss (http://doc.trolltech.com/4.6/qtime.html#toString) if they are one hour or longer, and as m:ss - if less than an hour, but since sorting of QStrings is alphabetical, then, for instance, 5:20 is "more" than 12:09 as its first digit is greater.

is there an elegant way to do the sorting?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

墨洒年华 2024-09-18 12:54:18
  • 当调用“setData”设置项目的数据时,直接设置 q QTime 对象
  • 子类 QItemDelegate 并通过简单地绘制文本来处理显示,如有必要,覆盖 sizeHint
  • 调用 QAbstractItemView::setItemDelegateForColumn 来设置持续时间列的委托。

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

  • When call "setData" to set an item's data, set q QTime object directly
  • Subclass QItemDelegate and handle display by simply draw a text, override sizeHint if necessary
  • Call QAbstractItemView::setItemDelegateForColumn to set your delegate for the duration column.

By this approach, you can display your QTime data with your approach, and sort correctly.

﹂绝世的画 2024-09-18 12:54:18

我对已接受答案的实现[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);
}

my implementation of the accepted answer [DurationDelegate is a subclass of 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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文