Qt c++ 图形选中高亮 选中其他地方恢复
时间: 2023-10-11 19:13:05 浏览: 136
要实现图形元素选中高亮,并且在选中其他地方时恢复,可以通过以下步骤实现:
1. 在绘制图形元素时,维护一个变量来表示该元素是否被选中,如果被选中,则在绘制时使用高亮颜色绘制。
2. 在鼠标按下事件中,判断鼠标是否在图形元素所在区域内,如果在,则将该元素标记为选中状态,并更新界面。
3. 在鼠标移动事件中,判断鼠标是否在其他图形元素所在区域内,如果在,则将当前选中元素恢复为未选中状态,并将新选中的元素标记为选中状态,并更新界面。
4. 在鼠标释放事件中,将选中元素标记为未选中状态,并更新界面。
以下是示例代码:
```cpp
class GraphicsItem : public QGraphicsItem
{
public:
GraphicsItem()
: m_selected(false)
{
}
void setSelected(bool selected)
{
if (m_selected != selected) {
m_selected = selected;
update();
}
}
bool isSelected() const
{
return m_selected;
}
protected:
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
if (m_selected) {
painter->setBrush(Qt::red);
} else {
painter->setBrush(Qt::blue);
}
painter->drawRect(boundingRect());
}
void mousePressEvent(QGraphicsSceneMouseEvent* event) override
{
if (event->button() == Qt::LeftButton) {
setSelected(true);
} else {
QGraphicsItem::mousePressEvent(event);
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override
{
if (isSelected()) {
QGraphicsScene* scene = this->scene();
QList<QGraphicsItem*> items = scene->items(event->scenePos());
foreach(QGraphicsItem* item, items) {
if (item != this) {
GraphicsItem* graphicsItem = dynamic_cast<GraphicsItem*>(item);
if (graphicsItem) {
graphicsItem->setSelected(true);
setSelected(false);
break;
}
}
}
} else {
QGraphicsItem::mouseMoveEvent(event);
}
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override
{
if (event->button() == Qt::LeftButton) {
setSelected(false);
} else {
QGraphicsItem::mouseReleaseEvent(event);
}
}
private:
bool m_selected;
};
```
在此示例中,我们继承了 QGraphicsItem 类,实现了鼠标事件的处理,以及绘制函数,通过 setSelected() 函数设置选中状态,并在 paint() 函数中根据选中状态绘制不同的颜色。在鼠标事件中,我们判断鼠标是否在当前图形元素内,如果在,则将其标记为选中状态,并在 mouseMoveEvent() 函数中判断鼠标是否在其他图形元素内,并将当前选中元素恢复为未选中状态。在 mouseReleaseEvent() 函数中,将当前选中元素标记为未选中状态。
阅读全文