You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用QGraphicsScene::clearSelection()取消多选高亮?

解决方案

1. 修复多选失效问题

你遇到selectedItems().size()始终为1的核心原因是QGraphicsView默认是单选模式,需要先开启多选支持:

// 在视图初始化代码中添加(比如构造函数里)
_view->setSelectionMode(QGraphicsView::MultiSelection);
// 若需要按住Ctrl/Shift实现累加选中,用ExtendedSelection:
// _view->setSelectionMode(QGraphicsView::ExtendedSelection);

设置后,点击多个项时selectedItems()会返回所有选中元素,不再局限于单个。

2. 单个对象取消高亮的优化

无需遍历全场景,直接针对目标项操作即可:

// 取消单个指定项的高亮
void UnhighlightSingleItem(QGraphicsItem* targetItem) {
    myPoly* pItem = qgraphicsitem_cast<myPoly*>(targetItem);
    if (pItem) {
        pItem->setSelected(false);
        pItem->setPen(QPen(QColor("red"))); // 恢复默认红色画笔
    }
}

调用时直接传入要取消高亮的item,性能开销为O(1)。

3. 用clearSelection()批量取消所有高亮

clearSelection()仅清除选中状态,不会自动恢复画笔样式,需要结合selectedItems()先处理样式,再清除选中:

// 批量取消所有高亮项
void ClearAllHighlighted() {
    // 仅遍历当前选中的项,而非全场景100+项
    foreach (QGraphicsItem* item, scene->selectedItems()) {
        myPoly* pItem = qgraphicsitem_cast<myPoly*>(item);
        if (pItem) {
            pItem->setPen(QPen(QColor("red"))); // 恢复默认样式
        }
    }
    // 快速清除所有选中状态
    scene->clearSelection();
}

这种方式只处理当前选中的项,相比遍历全场景,性能开销随选中数量变化,远低于原Refresh()的O(n)复杂度。

4. 可选:优化高亮/取消高亮的代码结构

建议在myPoly类中封装样式切换逻辑,避免重复创建QPen:

class myPoly : public QGraphicsPathItem {
private:
    QPen m_defaultPen;
    QPen m_highlightPen;
public:
    myPoly() {
        m_defaultPen = QPen(QColor("red"));
        m_highlightPen = QPen(Qt::SolidLine);
        m_highlightPen.setWidth(1);
        setPen(m_defaultPen);
        setFlag(QGraphicsItem::ItemIsSelectable); // 初始化时设置可选标记
    }

    void toggleHighlight(bool isHighlighted) {
        setSelected(isHighlighted);
        setPen(isHighlighted ? m_highlightPen : m_defaultPen);
    }
};

之后高亮/取消代码会更简洁:

// 高亮代码简化
if (polylineItem) {
    static_cast<myPoly*>(polylineItem)->toggleHighlight(true);
}

// 批量取消简化
foreach (QGraphicsItem* item, scene->selectedItems()) {
    myPoly* pItem = qgraphicsitem_cast<myPoly*>(item);
    if (pItem) pItem->toggleHighlight(false);
}
scene->clearSelection();

内容的提问来源于stack exchange,提问作者tushar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 16:24:20