当QGraphicsItem超出QGraphicsView边界,不需要将QGraphicsItem限制在场景范围内只是不扩展边界视野不移动,且不禁用滚动条,C++
时间: 2024-01-24 22:15:28 浏览: 103
如果不想将QGraphicsItem限制在场景范围内,而只是不希望QGraphicsItem超出QGraphicsView边界时进行扩展处理,且不禁用滚动条,可以通过重载QGraphicsView的`scrollContentsBy()`函数来实现。`scrollContentsBy()`函数是QGraphicsView的一个保护函数,用于在视野滚动时调整场景中的内容。在重载该函数时,可以在QGraphicsItem超出视图边界时,不让视野随之滚动,从而实现不扩展边界且不禁用滚动条的效果。示例代码如下:
```cpp
class CustomView : public QGraphicsView
{
public:
CustomView(QWidget* parent = nullptr) : QGraphicsView(parent)
{
setRenderHint(QPainter::Antialiasing);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
}
protected:
void scrollContentsBy(int dx, int dy) override
{
// 获取当前视野的矩形区域
QRectF visibleRect = mapToScene(viewport()->rect()).boundingRect();
// 获取场景的矩形区域
QRectF sceneRect = scene()->itemsBoundingRect();
// 如果当前视野超出了场景的矩形区域,则不滚动视野
if (visibleRect.intersects(sceneRect))
{
QGraphicsView::scrollContentsBy(dx, dy);
}
}
};
```
在上述代码中,我们重载了`scrollContentsBy()`函数,并在其中实现了不让视野滚动的逻辑。具体来说,我们首先获取当前视野的矩形区域和场景的矩形区域,然后判断当前视野是否超出了场景的矩形区域。如果没有超出,则调用`QGraphicsView::scrollContentsBy()`函数实现视野滚动,否则不做处理。最后,我们使用`CustomView`类代替QGraphicsView来创建我们的视图即可。
阅读全文