كيو تي:كيف يمكنني تمييز العناصر المكررة في QListWidget؟(قطجمبي)

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);
        }
    }
}
هل كانت مفيدة؟

المحلول

عادةً ما أستخدم الخرائط لهذه الأنواع من المهام:

private final class DelegateValuesStorage {
    private final Map<Object, Integer> values = new HashMap<Object, Integer>();

    ....

    //Add value or increase a count if exists
    public void add(final Object value) {
       Integer count = values.get(value);
       if (count == null) {
          values.put(value, 1);
       } else {
          values.put(value, count + 1);
       }
    }

    ....

    //Decrease a count or remove value if it doesn't exist anymore
    public void decreaseCount(final Object value) {
        if(value == null) {
            return;
        }
        Integer count = values.get(value);
        if (count == null) {
            // decreasing a "new" value - could be an error too
            return;
        }
        if (count <= 1) {
            // remove the value from the map
            values.remove(value);
        } else {
            values.put(value, count - 1);
        }
    }
}

يجب تمكين التمييز الآن إذا

values.get(value) > 1

يكون true.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top