-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 运算符 virtual bool operator< ( const QStandardItem & other ) const

这样的功能compare可以在单独的文件中重新定义,在*.pro中添加很简单,简单的应用程序就会找到它的实现。但是对于更困难的应用程序,这是不可能的。请告诉我为什么?

示例:代码

4

3 回答 3

2

QStandardItemModel您不想直接使用 a ,而是将其包装在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.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 链接到我项目的主要应用程序的 *.pro 。通常不需要在 *.h 文件中声明它。所有其他插件都继承了这个重新定义。实验表明,有必要链接到主应用程序。就这样。

我的推理可能是错误的,但它适用于linux和windows。

这是QStringCompare.libs的来源。你可以试试。

于 2012-11-29T06:34:30.490 回答