我的任务是在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
答案 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的来源。你可以试试。