2011-09-12 15 views
1

重複した値を強調する仕組みを実装する必要があります。値は、値のタイプ(文字列編集、長いものと大きいものの小数点 - スピンボックス)に応じてデリゲートによって編集されます。現在、すべての値とその数を2つの「並列」リストに格納する追加のクラスの助けを借りて、この機能を実装しました。そして、新しい値を追加した後は、カウント数を増やします(繰り返し値を削除すると減少します)が、この解決策はあまりにも大きいようです。あなたたちは、QItemDelegateのsetModelData(...)メソッドで強調表示するための他のアイデアを持っていますか?Qt:QListWidgetで重複した項目をハイライト表示するにはどうすればよいですか? (qtjambi)

/** 
* 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); 
     } 
    } 
} 

答えて

3

私は通常、タスクのそれらの種類のマップを使用します。

values.get(value) > 1 

trueであれば、今の強調表示

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); 
     } 
    } 
} 

を有効にする必要があります。

関連する問題