2

QSortFilterProxyModel でアイテムを期間で並べ替えようとしています。

前提条件:

  1. 時間と分の先頭にゼロを付けてはいけません
  2. 期間が 1 時間未満の場合、時間は表示せず、分と秒のみを表示する必要があります
  3. 期間が 1 分未満の場合は、0 分と対応する秒数を表示する必要があります [0:42]

期間が 1 時間以上の場合はH:mm:ss ( http://doc.trolltech.com/4.6/qtime.html#toString )としてソース モデルに期間を格納しようとし、それより短い場合は m:ss として格納しようとしました。 1 時間ですが、QString の並べ替えはアルファベット順であるため、たとえば、5:20 は 12:09 よりも 1 桁目が大きいため「多い」ことになります。

ソートを行うエレガントな方法はありますか?

4

2 に答える 2

4
  • 「setData」を呼び出してアイテムのデータを設定するときは、QTime オブジェクトを直接設定します
  • QItemDelegate をサブクラス化し、テキストを描画するだけで表示を処理し、必要に応じて sizeHint をオーバーライドします
  • QAbstractItemView::setItemDelegateForColumn を呼び出して、duration 列のデリゲートを設定します。

このアプローチにより、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 に答える