根据子数据对qtreewidget顶层项进行排序

sort qtreewidget toplevel item base on a child data

本文关键字:排序 qtreewidget 数据      更新时间:2023-10-16

我有一个qtreewidgettoplevelitems。每个toplevelitem都有4个childeren,每个子元素都有特殊的值,所有toplevelitems的第一个子元素是它的父元素成本,我想sort这个toplevelitems基于这个成本,但是我不知道怎么做?我的想法是每次添加toplevelitem时,将toplevelitems及其成本保留在mapaddtake中,但我正在寻找更好的方法。

默认情况下,tree小部件根据它们的文本对项目进行排序,但是您可以通过覆盖QTreeWidgetItem的操作符<()来更改它。下面是带有特定操作符的自定义QTreeWidgetItem的示例(参见注释):

class TreeWidgetItem : public QTreeWidgetItem
{
public:
    // The constructors. Add more, if needed.
    TreeWidgetItem(QTreeWidget *parent, const QStringList &strings,
                   int type = Type)
        : QTreeWidgetItem(parent, strings, type)
    {}
    TreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings,
                   int type = Type)
        : QTreeWidgetItem(parent, strings, type)
    {}
    // Compares two tree widget items. The logic can be changed.
    bool operator<(const QTreeWidgetItem& other) const
    {
        // Get the price - the first child node
        int price1 = 0;
        if (childCount() > 0)
        {
            QTreeWidgetItem *firstChild = child(0);
            price1 = firstChild->text(0).toInt();
        }
        // Get the second price - the first child node
        int price2 = 0;
        if (other.childCount() > 0)
        {
            QTreeWidgetItem *firstChild = other.child(0);
            price2 = firstChild->text(0).toInt();
        }
        // Compare two prices.
        return price1 < price2;
    }
};

这个类可以与QTreeWidget一起使用:

// The sortable tree widget.
QTreeWidget tw;
tw.setSortingEnabled(true);
QTreeWidgetItem *item1 = new TreeWidgetItem(&tw, QStringList() << "Item1");
QTreeWidgetItem *child1 = new TreeWidgetItem(item1, QStringList() << "10");
QTreeWidgetItem *item2 = new TreeWidgetItem(&tw, QStringList() << "Item2");
QTreeWidgetItem *child2 = new TreeWidgetItem(item2, QStringList() << "11");    
tw.show();