QGraphicsItem外边的选中状态怎么做
时间: 2023-07-08 22:48:20 浏览: 296
要实现QGraphicsItem外边的选中状态,一种常见的方式是使用QPainter在QGraphicsView上绘制矩形框。具体步骤如下:
1. 在QGraphicsItem的构造函数中设置Flag为ItemIsSelectable,以便让QGraphicsView知道这个Item可以被选中。
2. 在QGraphicsView中,重写mousePressEvent和mouseReleaseEvent函数,记录下鼠标按下和释放的位置,并在mouseReleaseEvent中绘制矩形框。
3. 在QGraphicsView中,重写mouseMoveEvent函数,实时更新矩形框的位置和大小。
4. 在QGraphicsView中,重写keyPressEvent函数,处理Delete键等删除选中Item的操作。
需要注意的是,为了让矩形框覆盖在QGraphicsItem之外,需要将QGraphicsView的背景设置为透明。
下面是一个示例代码片段,可以作为参考:
```
void MyGraphicsView::mousePressEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
m_selectionStart = event->pos();
m_selectionRect = QRect();
}
QGraphicsView::mousePressEvent(event);
}
void MyGraphicsView::mouseMoveEvent(QMouseEvent* event)
{
if(event->buttons() & Qt::LeftButton)
{
m_selectionRect = QRect(m_selectionStart, event->pos()).normalized();
update();
}
QGraphicsView::mouseMoveEvent(event);
}
void MyGraphicsView::mouseReleaseEvent(QMouseEvent* event)
{
if(event->button() == Qt::LeftButton)
{
m_selectionRect = QRect(m_selectionStart, event->pos()).normalized();
update();
QList<QGraphicsItem*> items = items(m_selectionRect, Qt::IntersectsItemShape);
foreach(QGraphicsItem* item, items)
{
item->setSelected(true);
}
}
QGraphicsView::mouseReleaseEvent(event);
}
void MyGraphicsView::keyPressEvent(QKeyEvent* event)
{
if(event->key() == Qt::Key_Delete)
{
QList<QGraphicsItem*> items = scene()->selectedItems();
foreach(QGraphicsItem* item, items)
{
scene()->removeItem(item);
delete item;
}
}
QGraphicsView::keyPressEvent(event);
}
void MyGraphicsView::drawForeground(QPainter* painter, const QRectF& rect)
{
if(!m_selectionRect.isNull())
{
painter->setPen(QPen(Qt::blue, 1, Qt::DashLine));
painter->setBrush(Qt::NoBrush);
painter->drawRect(m_selectionRect);
}
}
```
阅读全文