Qt:如何突出显示 QListWidget 中的重复项? (qtjambi)

Posted

技术标签:

【中文标题】Qt:如何突出显示 QListWidget 中的重复项? (qtjambi)【英文标题】:Qt: how do I highlight duplicated items in QListWidget? (qtjambi) 【发布时间】:2011-09-12 06:18:16 【问题描述】:

我需要实现一种突出显示重复值的机制。根据值类型(字符串 - 行编辑、长和大十进制 - 旋转框),通过委托编辑值。目前,我在附加类的帮助下实现了此功能,该类将所有值及其计数存储在两个“并行”列表中。在添加一个新值之后,我增加了它的计数(或者在删除重复值时减少),但是这个解决方案似乎太庞大了。对于 QItemDelegate 的 setModelData(...) 方法中的高亮,你们有什么其他想法吗?

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

【问题讨论】:

【参考方案1】:

我通常将地图用于这些类型的任务:

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

【讨论】:

以上是关于Qt:如何突出显示 QListWidget 中的重复项? (qtjambi)的主要内容,如果未能解决你的问题,请参考以下文章

不想在qlistWidget中点击/突出显示图标

Qt QListWidget实现图片缩略图列表

Qt - 在 MainWindow 上显示由 QListWidget 选择的动画 GIF

Qt C++ QListView 或 QListWidget 中的字体列表并将它们表示为复选框

Qt QML 如何格式化(突出显示)文本

Qt - 如何从 QListWidget 中获取选定的自定义项目?