Qt的。在重型应用程序中重新定义QString :: compare

时间:2012-11-28 06:37:08

标签: qt sorting

我的任务是在QStandardItemModel中自定义排序项目。 默认情况下为行的序列

 text1
 text11
 text12
 text100
 text110
 text120
 text1110

QStandardItemModel::sort()函数排序为

 text1
 text100
 text11
 text110
 text1110
 text12
 text120

我希望那会是

 text1
 text11
 text12
 text100
 text110
 text120
 text1110

为此,我在separeted 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);
   }

在运营商中使用 virtual bool operator< ( const QStandardItem & other ) const

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

示例:code

3 个答案:

答案 0 :(得分:2)

您希望将其包装在QStandardItemModel中,而不是直接使用QSortFilterProxyModel。此类专为您描述的情况而设计 - 当您要实现自定义排序或过滤行为时。只需实现QSortFilterProxyModel::lessThan方法即可反映所需的行为。

答案 1 :(得分:0)

QStandardItemModel有一个虚函数sort(int column, Qt::SortOrder order = Qt::AscendingOrder)。我认为继承QStandardItemModel并重新实现sort函数会更容易。

答案 2 :(得分:-2)

我做到了!

当我说“繁重的应用程序”时,我的意思是应用程序,它包含并绑定许多其他插件和库。为了这个目的,我创建了名为QStringCompare的新lib,它包含一个文件compare.cpp和我的新definiotoin比较:

#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的来源。你可以试试。