不重载scrollContentsBy()函数可以吗
时间: 2023-12-17 13:03:11 浏览: 57
如果不想重载`scrollContentsBy()`函数,也可以通过其他方法来实现在QGraphicsItem超出QGraphicsView边界时不进行扩展处理且不禁用滚动条的效果。
一种方法是设置QGraphicsView的`alignment()`属性为`Qt::AlignLeft | Qt::AlignTop`,并将QGraphicsScene的`sceneRect()`属性设置为QGraphicsItem的边界矩形。这样QGraphicsItem超出QGraphicsView边界时,不会进行扩展处理,而是会被限制在场景范围内。同时,滚动条也不会被禁用。示例代码如下:
```cpp
QGraphicsView* view = new QGraphicsView();
QGraphicsScene* scene = new QGraphicsScene();
view->setScene(scene);
view->setRenderHint(QPainter::Antialiasing);
// 设置对齐方式为左上角对齐
view->setAlignment(Qt::AlignLeft | Qt::AlignTop);
// 设置场景范围为QGraphicsItem的边界矩形
QGraphicsItem* item = new QGraphicsItem();
scene->addItem(item);
view->setSceneRect(item->boundingRect());
```
另一种方法是使用QGraphicsProxyWidget来包装QGraphicsItem并添加到QGraphicsScene中。QGraphicsProxyWidget可以将QWidget包装成QGraphicsItem,从而在QGraphicsView中显示。当QGraphicsProxyWidget超出QGraphicsView边界时,不会进行扩展处理,而是会被限制在场景范围内。同时,滚动条也不会被禁用。示例代码如下:
```cpp
QGraphicsView* view = new QGraphicsView();
QGraphicsScene* scene = new QGraphicsScene();
view->setScene(scene);
view->setRenderHint(QPainter::Antialiasing);
// 设置场景范围为视图大小
view->setSceneRect(0, 0, view->viewport()->width(), view->viewport()->height());
// 创建QWidget并添加到QGraphicsScene中
QWidget* widget = new QWidget();
QGraphicsProxyWidget* proxyWidget = scene->addWidget(widget);
// 设置QGraphicsProxyWidget的大小为QWidget的大小
proxyWidget->setMinimumSize(widget->size());
proxyWidget->setMaximumSize(widget->size());
```
在上述代码中,我们创建了一个QWidget,并使用QGraphicsProxyWidget将其包装成QGraphicsItem添加到QGraphicsScene中。我们还设置了QGraphicsProxyWidget的最小和最大大小为QWidget的大小,这样QGraphicsProxyWidget的大小就不会超出QWidget的大小。最后,我们使用QGraphicsView来显示QGraphicsScene即可。
阅读全文