如何使用Qt对持续时间进行排序?
我试图让QSortFilterProxyModel按持续时间对项目进行排序 先决条件:如何使用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“多”,因为它的第一个数字更大 有没有一种优雅的方式来进行排
- 调用“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选项、画师、小部件);
}