无法使用 QSortFilterProxyModel 按角色排序按 QDateTime 对模型进行排序
Can't sort model by QDateTime with using QSortFilterProxyModel sort by role
我遇到了一个简单的问题,但我无法弄清楚为什么我的模型没有排序。
我有 SimpleModel class 继承自 QAbstractListModel 我想按 DateTime 排序角色。
这就是我在 main.cpp
中设置代理的方式:
SimpleModel m;
ProxyModel proxyModel;
proxyModel.setSourceModel(&m);
proxyModel.setSortRole(SimpleModel::SimpleRoles::DateTimeRole);
engine.rootContext()->setContextProperty("simpleModel", &proxyModel);
我在 SimpleModel 中的项目是来自 SimpleItem class 的对象,它只有名称和日期时间。这是我的 SimpleModel 数据方法:
QVariant SimpleModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) {
return QVariant();
}
auto simpleItem = static_cast<SimpleItem*>(index.internalPointer());
if (!simpleItem) {
return QVariant();
}
if(role == NameRole) {
return simpleItem->name();
}
//This is used for displaying in QML
else if(role == DateRole) {
return simpleItem->dateTime().toString("yyyy-MM-dd");
}
// This is used for dsiplaying in QML too
else if(role == TimeRole) {
return simpleItem->dateTime().toString("hh:mm");
}
// This Role is only used for sorting
else if(role == DateTimeRole) {
return simpleItem->dateTime();
}
return QVariant();
}
在我继承自 QSortFilterProxyModel class 的 ProxyModel 中,我实现了 lessThan()
方法,但它从来没有被调用:
bool ProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
qDebug() << "called lessThan()";
QVariant leftData = sourceModel()->data(source_left);
QVariant rightData = sourceModel()->data(source_right);
if (leftData.userType() == QMetaType::QDateTime)
return leftData.toDateTime() < rightData.toDateTime();
return false;
}
我做错了什么或者你有什么想法我可以试试吗?如果您需要更多代码,我会更新。
提前致谢。
如你所说
it works after calling proxyModel.sort(0, Qt::DescendingOrder); after setSortRole
我遇到了一个简单的问题,但我无法弄清楚为什么我的模型没有排序。 我有 SimpleModel class 继承自 QAbstractListModel 我想按 DateTime 排序角色。
这就是我在 main.cpp
中设置代理的方式:
SimpleModel m;
ProxyModel proxyModel;
proxyModel.setSourceModel(&m);
proxyModel.setSortRole(SimpleModel::SimpleRoles::DateTimeRole);
engine.rootContext()->setContextProperty("simpleModel", &proxyModel);
我在 SimpleModel 中的项目是来自 SimpleItem class 的对象,它只有名称和日期时间。这是我的 SimpleModel 数据方法:
QVariant SimpleModel::data(const QModelIndex &index, int role) const
{
if(!index.isValid()) {
return QVariant();
}
auto simpleItem = static_cast<SimpleItem*>(index.internalPointer());
if (!simpleItem) {
return QVariant();
}
if(role == NameRole) {
return simpleItem->name();
}
//This is used for displaying in QML
else if(role == DateRole) {
return simpleItem->dateTime().toString("yyyy-MM-dd");
}
// This is used for dsiplaying in QML too
else if(role == TimeRole) {
return simpleItem->dateTime().toString("hh:mm");
}
// This Role is only used for sorting
else if(role == DateTimeRole) {
return simpleItem->dateTime();
}
return QVariant();
}
在我继承自 QSortFilterProxyModel class 的 ProxyModel 中,我实现了 lessThan()
方法,但它从来没有被调用:
bool ProxyModel::lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
{
qDebug() << "called lessThan()";
QVariant leftData = sourceModel()->data(source_left);
QVariant rightData = sourceModel()->data(source_right);
if (leftData.userType() == QMetaType::QDateTime)
return leftData.toDateTime() < rightData.toDateTime();
return false;
}
我做错了什么或者你有什么想法我可以试试吗?如果您需要更多代码,我会更新。 提前致谢。
如你所说
it works after calling proxyModel.sort(0, Qt::DescendingOrder); after setSortRole