重写QGraphicsView::RubberBandDrag 不能选中graphicsItem
时间: 2024-01-06 14:06:20 浏览: 104
QGraphicsView::RubberBandDrag是QGraphicsView的一个虚函数,用于实现在视图中用鼠标拖动矩形选择区域的功能。重写该函数可以实现在矩形选择区域内选择图元的功能,但默认情况下不会选中图元。
如果希望在选择区域内选中图元,可以在重写QGraphicsView::RubberBandDrag函数的同时,重写QGraphicsScene::mousePressEvent和QGraphicsScene::mouseReleaseEvent函数,实现相关的操作。
具体实现方法可以参考以下代码:
```
void MyGraphicsView::mousePressEvent(QMouseEvent *event) {
QGraphicsView::mousePressEvent(event);
if (event->button() == Qt::LeftButton && !event->isAccepted()) {
QPointF scenePos = mapToScene(event->pos());
QGraphicsItem *item = scene()->itemAt(scenePos, transform());
if (item) {
item->setSelected(true);
}
}
}
void MyGraphicsView::mouseReleaseEvent(QMouseEvent *event) {
QGraphicsView::mouseReleaseEvent(event);
if (event->button() == Qt::LeftButton) {
QList<QGraphicsItem *> items = scene()->selectedItems();
foreach (QGraphicsItem *item, items) {
item->setSelected(false);
}
}
}
void MyGraphicsView::rubberBandDrag(QRect rubberBandRect, QPointF rubberBandOrigin) {
QGraphicsView::rubberBandDrag(rubberBandRect, rubberBandOrigin);
QList<QGraphicsItem *> items = scene()->items(mapToScene(rubberBandRect).boundingRect(), Qt::IntersectsItemShape, Qt::AscendingOrder, transform());
foreach (QGraphicsItem *item, items) {
item->setSelected(true);
}
}
```
在mousePressEvent函数中,判断鼠标是否按下左键,并且没有被其他地方处理,然后通过mapToScene函数将鼠标位置转换为场景坐标系中的位置,接着调用QGraphicsScene::itemAt函数获取该位置下的图元,如果存在该图元,则设置其为选中状态。
在mouseReleaseEvent函数中,判断鼠标是否释放左键,然后遍历场景中所有被选中的图元,将其设置为未选中状态。
在rubberBandDrag函数中,调用QGraphicsScene::items函数获取矩形选择区域内和图元形状相交的所有图元,然后将它们设置为选中状态。
这样就可以实现在选择区域内选中图元的功能了。
阅读全文