sort qtreewidget, чтобы дополнить базу элементов на дочерних данных

У меня есть qtreewidget с toplevelitems, каждый toplevelitem имеет 4 childeren, каждый ребенок имеет особую ценность, первый ребенок из всех toplevelitems - это его стоимость, я хочу sort этот toplevelitems основываться на этой стоимости, но я не знаю, как это сделать? моя идея состоит в том, чтобы сохранить это toplevelitems и их стоимость в map а также add а также take они каждый раз toplevelitem добавлено, но я ищу лучший способ. заранее спасибо.

1 ответ

Решение

По умолчанию виджет дерева сортирует элементы по их текстам, однако вы можете изменить его, переопределив оператор<() 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();
Другие вопросы по тегам