-1

私の仕事は、QStandardItemModel でアイテムをカスタムソートすることです。デフォルトでは、一連の行

 text1
 text11
 text12
 text100
 text110
 text120
 text1110

関数は次のようQStandardItemModel::sort()にソートします

 text1
 text100
 text11
 text110
 text1110
 text12
 text120

私はそれが欲しい

 text1
 text11
 text12
 text100
 text110
 text120
 text1110

この目的のためにint QString::compare(const QString &s) const 、分離された compare.cpp ファイルで関数をオーバーロードします。

   int QString::compare(const QString &s) const
   {
       QString strL = "";
       strL.append(this);
       QString strR = "";
       strR.append(s);

       QStringList list = strL.split(QRegExp("\\D+"),QString::SkipEmptyParts);
       foreach (QString num, list) {
           strL.replace(num, QString("%1").arg(num,10,'0'));
       }

       list = strR.split(QRegExp("\\D+"),QString::SkipEmptyParts);
       foreach (QString num, list) {
           strR.replace(num, QString("%1").arg(num,10,'0'));
       }

       return strL.localeAwareCompare(strR);
   }

in operator を使用すること virtual bool operator< ( const QStandardItem & other ) const

このような機能compareは、別のファイルで再定義でき、*.pro に簡単に追加でき、簡単なアプリケーションでその実現を見つけることができます。しかし、より難しいアプリケーションでは、そのような方法は不可能です。どうしてか言ってくれない?

例:コード

4

3 に答える 3

2

直接使用するのではなく、QStandardItemModelでラップする必要がありQSortFilterProxyModelます。このクラスは、カスタムの並べ替えまたはフィルタリングの動作を実装する場合など、説明する状況に合わせて設計されています。QSortFilterProxyModel::lessThan目的の動作を反映するようにメソッドを実装するだけです。

于 2012-11-28T14:24:53.097 に答える
0

QStandardItemModelには仮想関数がありますsort(int column, Qt::SortOrder order = Qt::AscendingOrder)QStandardItemModel関数をサブクラス化して再実装する方が簡単だと思いsortます。

于 2012-11-28T06:59:48.283 に答える
-2

やった!

「重いアプリケーション」とは、他の多くのプラグインとライブラリを含み、それらをバインドするアプリケーションを意味します。そして、この目的のために、QStringCompare という名前の新しいライブラリを作成します。これには、compare の新しい定義を持つ 1 つのファイル compare.cpp が含まれます。

#include <QStringList>
#include <QRegExp>
int Q_DECL_EXPORT QString::compare(const QString &s) const
{
    QString strL = "";
    strL.append(this);
    QString strR = "";
    strR.append(s);

    QStringList list = strL.split(QRegExp("\\D+"),QString::SkipEmptyParts);
    foreach (QString num, list) {
        strL.replace(num, QString("%1").arg(num,10,'0'));
    }

    list = strR.split(QRegExp("\\D+"),QString::SkipEmptyParts);
    foreach (QString num, list) {
        strR.replace(num, QString("%1").arg(num,10,'0'));
    }

    return strL.localeAwareCompare(strR);
} 

QStringCompare.lib を私のプロジェクトの Main アプリケーションの *.pro にリンクします。通常、*.h ファイルで宣言する必要はありません。他のすべてのプラグインは、この再定義を継承します。実験により、メインアプリケーションへのリンクが必要であることがわかりました。その通り。

推論が間違っている可能性がありますが、Linux と Windows で動作しています。

これはQStringCompare.libsのソースです。あなたが試すことができます。

于 2012-11-29T06:34:30.490 に答える