当QGraphicsItem超出QGraphicsView边界,不做边界扩展处理
时间: 2023-08-26 21:28:09 浏览: 166
如果想让QGraphicsItem在超出QGraphicsView边界时不做边界扩展处理,可以通过设置QGraphicsView的属性来实现。具体来说,可以设置QGraphicsView的"SceneRect"属性为QRectF(),表示场景范围为一个空矩形,这样QGraphicsItem超出视图边界后就不会被裁剪或者扩展到视图范围内了。示例代码如下:
```python
view = QGraphicsView()
scene = QGraphicsScene()
view.setScene(scene)
view.setRenderHint(QPainter.Antialiasing)
view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
# 设置场景范围为空矩形
view.setSceneRect(QRectF())
```
这样设置后,当QGraphicsItem超出视图边界时,不会被自动调整到视图范围内,而是会被截断。
相关问题
当QGraphicsItem超出QGraphicsView边界,不扩展边界C++
如果想让QGraphicsItem在超出QGraphicsView边界时不做边界扩展处理,可以通过设置QGraphicsView的属性来实现。具体来说,可以设置QGraphicsView的`sceneRect`属性为`QRectF()`,表示场景范围为一个空矩形,这样QGraphicsItem超出视图边界后就不会被裁剪或者扩展到视图范围内了。示例代码如下:
```cpp
QGraphicsView* view = new QGraphicsView();
QGraphicsScene* scene = new QGraphicsScene();
view->setScene(scene);
view->setRenderHint(QPainter::Antialiasing);
view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 设置场景范围为空矩形
view->setSceneRect(QRectF());
// 添加QGraphicsItem到场景中
QGraphicsItem* item = new QGraphicsItem();
scene->addItem(item);
```
这样设置后,当QGraphicsItem超出视图边界时,不会被自动调整到视图范围内,而是会被截断。
当QGraphicsItem超出QGraphicsView边界,不需要将QGraphicsItem限制在场景范围内只是不扩展边界视野不移动,且不禁用滚动条,C++
如果不想将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来创建我们的视图即可。
阅读全文