我在QTreeWidget
中使用了以下自定义的QTreeWidget
#ifndef FEDERATELISTITEM_HPP_
#define FEDERATELISTITEM_HPP_
#include <QTreeWidgetItem>
class FederateListItem : public QTreeWidgetItem {
public:
enum Type : int {
Federate = 101,
FederateNamespace = 102
};
public:
FederateListItem(QTreeWidget* parent, Type type);
FederateListItem(QTreeWidgetItem* parent, Type type);
public:
bool operator<(const QTreeWidgetItem& other) const;
bool operator==(const QTreeWidgetItem& other) const;
};
#endif // !FEDERATELISTITEM_HPP_
#include "FederateListItem.hpp"
///////////////////////////////////////////////////////////////////////////////
// CONSTANTS SECTION //
///////////////////////////////////////////////////////////////////////////////
const QString FederateNamespaceCloseIcon{ ":/icons/FederateNamespaceActive.png" };
const QString FederateIcon(":/icons/FederateActive.png");
///////////////////////////////////////////////////////////////////////////////
// PUBLIC SECTION //
///////////////////////////////////////////////////////////////////////////////
FederateListItem::FederateListItem(QTreeWidget* parent, Type type) :
QTreeWidgetItem(parent, static_cast<int>(type)) {
switch (type) {
case Type::Federate: {
setIcon(0, QIcon(FederateIcon));
} break;
case Type::FederateNamespace: {
setIcon(0, QIcon(FederateNamespaceCloseIcon));
} break;
default: {
}
}
}
FederateListItem::FederateListItem(QTreeWidgetItem* parent, Type type) :
QTreeWidgetItem(parent, static_cast<int>(type)) {
switch (type) {
case Type::Federate: {
setIcon(0, QIcon(FederateIcon));
} break;
case Type::FederateNamespace: {
setIcon(0, QIcon(FederateNamespaceCloseIcon));
} break;
default: {
}
}
}
///////////////////////////////////////////////////////////////////////////////
// PUBLIC MEMBER OPERATORS SECTION //
///////////////////////////////////////////////////////////////////////////////
bool FederateListItem::operator<(const QTreeWidgetItem& other) const {
if ((type() == Type::FederateNamespace) && (other.type() == Type::Federate)) {
return true;
}
return text(0) < other.text(0);
}
bool FederateListItem::operator==(const QTreeWidgetItem& other) const {
return (type() == other.type()) && (text(0) == other.text(0));
}
基本上,我需要使用两种类型的项:一种是federate
,一种是叶,另一种是可以包含federate
和federatenamespace
子项的federatenamespace
。
我想对它们进行排序,因此,在任何级别上,我首先有所有的federatenamespace
项,然后是federates
项。就像在Windows资源管理器中一样,我首先看到文件夹,然后看到文件。
为了在我的自定义项中实现这一点,我添加了一些操作符方法:首先,我检查项目的类型,并尝试给出FederateNamespace
项的先例,因此应该首先显示它们。如果类型相同,请按其名称排序。
然后我创建了QTreeWidget
m_tree = new QTreeWidget(this);
m_tree->setHeaderLabels({ FederatesLabel });
m_tree->setSortingEnabled(true);
当我开始添加相同类型的项目时,一切似乎都正常,正如我所看到的:
问题是排序不起作用。您可以在图像中看到没有执行排序。如果我试图混合元素,就会产生断言。
该断言由Qt提出,并指出比较器无效。
我做错了什么我怎么解决这个问题?
编辑
我听从了谢夫的建议,只要稍微调整一下,它就不管用了。问题是我的操作方法。这样做是可行的:
bool FederateListItem::operator<(const QTreeWidgetItem& other) const {
if ((type() == Type::FederateNamespace) && (other.type() == Type::Federate)) {
return false;
}
if ((type() == Type::Federate) && (other.type() == Type::FederateNamespace)) {
return true;
}
return text(0) > other.text(0);
}
发布于 2020-06-06 11:01:33
我的猜测在评论中写道:
--您不考虑
(type() == Type::Federate) && (other.type() == Type::FederateNamespace)
的情况,它应该导致false
,而不管text(0)
是什么。我知道这与text(0)
的区别,它来自于一个断言,该断言检查!(B < A)
以确保谓词实现/授予了严格的顺序。
我建议设立一个固定的较少的经营者:
bool FederateListItem::operator<(const QTreeWidgetItem& other) const {
if (type() != other.type()) return type() == Type::FederateNamespace;
return text(0) < other.text(0);
}
https://stackoverflow.com/questions/62230431
复制相似问题