Qt: как выделить повторяющиеся элементы в QListWidget?(qtjambi)

StackOverflow https://stackoverflow.com/questions/7383979

Вопрос

Мне нужно реализовать механизм выделения дублированных значений.Значения редактируются через делегат в зависимости от типа значения (строка - строка редактирования, длинные и большие десятичные или спиновые ящики).В настоящее время я реализовал эту функцию с помощью дополнительного класса, который хранит все значения и их количество в двух «параллельных» списках.И после добавления нового значения, я увеличиваю его число (или уменьшение, когда повторное значение удалено), но это решение кажется слишком громоздким.У вас, ребята, есть другие идеи на подсветке в стиле setModelData(...) qitemdelegate?

/**
* Stores a delegates' existing values
*/
private final class DelegateValuesStorage {
    private final List<Object> values = new ArrayList<Object>();
    private final List<Integer> counts = new ArrayList<Integer>();

    ....

    //Add value or increase a count if exists
    public void add(final Object value) {
        if(values.contains(value)) {
            final int valueIndex = values.indexOf(value);
            final int oldCount = counts.get(valueIndex);
            counts.remove(valueIndex);
            counts.add(valueIndex, oldCount + 1);
        } else {
            values.add(value);
            counts.add(1);
        }
    }

    ....

    //Decrease a count or remove value if it doesn't exist anymore
    public void decreaseCount(final Object value) {
        if(value == null) {
            return;
        }
        final int index = values.indexOf(value);
        if(index >= 0) {
            final int oldCount = counts.get(index);
            if(oldCount >= 2) {
                counts.remove(index);
                counts.add(index, oldCount - 1);
            } else {
                values.remove(index);
                counts.remove(index);
            }
        }
    }

/**
* Delegate
*/
private class ConcreteDelegate extends QItemDelegate {

    private final DelegateValuesStorage values = new DelegateValuesStorage(); 

    ...

    @Override
    public void setModelData(final QWidget editor, final QAbstractItemModel model, final QModelIndex index) {
        if(editor instanceof ValEditor) { // ValEditor is an abstraction of line edit and spin box over values' data types

            final Object value = ((ValEditor) editor).getValue();
            model.setData(index, value, Qt.ItemDataRole.UserRole);
            final String newData = (value == null) ? "" : String.valueOf(value);
            values.add(newData);
            final String oldData = (String) model.data(index, Qt.ItemDataRole.DisplayRole);
            values.decreaseCount(oldData);


            model.setData(index, newData, Qt.ItemDataRole.DisplayRole);
            model.setData(index, new QColor(0, 0, 0), Qt.ItemDataRole.ForegroundRole);
            redrawItems(model); // runs through values and colors them red if count >= 2; or black if count == 1

        } else {
            super.setModelData(editor, model, index);
        }
    }
}
.

Это было полезно?

Решение

Обычно я использую карты для таких задач:

родовое слово

Выделение сейчас должно быть включено, если

родовое слово

- это кодовый код.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top