Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Qt对持续时间进行排序?_Qt_Sorting_Duration_Model View - Fatal编程技术网

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

如何使用Qt对持续时间进行排序?,qt,sorting,duration,model-view,Qt,Sorting,Duration,Model View,我试图让QSortFilterProxyModel按持续时间对项目进行排序 先决条件: 小时和分钟不得有前导零 如果持续时间小于一小时,则不能显示小时,只能显示分和秒 如果持续时间小于一分钟,则必须显示0分钟和相应的秒数[0:42] 如果持续时间为一小时或更长,则尝试在源模型中将持续时间存储为H:mm:ss(),如果持续时间小于一小时,则将持续时间存储为m:ss,但由于QString的排序是按字母顺序的,因此,例如,5:20比12:09“多”,因为它的第一个数字更大 有没有一种优雅的方式来进行排

我试图让QSortFilterProxyModel按持续时间对项目进行排序

先决条件:

  • 小时和分钟不得有前导零
  • 如果持续时间小于一小时,则不能显示小时,只能显示分和秒
  • 如果持续时间小于一分钟,则必须显示0分钟和相应的秒数[0:42]
  • 如果持续时间为一小时或更长,则尝试在源模型中将持续时间存储为H:mm:ss(),如果持续时间小于一小时,则将持续时间存储为m:ss,但由于QString的排序是按字母顺序的,因此,例如,5:20比12:09“多”,因为它的第一个数字更大

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

    • 调用“setData”设置项目数据时,直接设置qqtime对象
    • 子类QItemDelegate并通过简单地绘制文本来处理显示,必要时覆盖sizeHint
    • 调用QAbstractItemView::setItemDelegateForColumn为duration列设置委托

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

    我对接受答案的实现[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);
    }
    
    void DurationDelegate::paint(QPainter*painter,const QStyleOptionViewItem&option,const QModelIndex&index)const{
    Q_断言(index.isValid());
    QStyleOptionViewItemV4 v4option=选项;
    initStyleOption(&v4option,index);
    constqwidget*小部件;
    常量QStyleOptionViewItemV4*v4=qstyleoption\u强制转换(&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格式;
    长度>=QTime(1,0)?格式=QString(“H:mm:ss”):格式=QString(“m:ss”);
    v4option.text=长度.toString(格式);
    }
    样式->绘图控件(QStyle::CE_ItemViewItem,&V4选项、画师、小部件);
    }