当QGraphicsItem超出QGraphicsView边界,不扩展边界C++
时间: 2023-08-26 18:28:09 浏览: 205
如果想让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来创建我们的视图即可。
c++继承QGraphicsItem
在C++中,继承QGraphicsItem可以创建自定义图形项,以便在QGraphicsScene中显示。以下是一个简单的示例:
```cpp
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}
QRectF boundingRect() const override
{
// 返回图形项的边界矩形
return QRectF(0, 0, 100, 100);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override
{
// 绘制图形项
painter->drawRect(boundingRect());
}
};
```
在这个示例中,我们创建了一个名为MyItem的自定义图形项,它继承自QGraphicsItem。我们重写了boundingRect()和paint()函数,分别用于返回图形项的边界矩形和绘制图形项。
如果我们想要在QGraphicsScene中显示这个自定义图形项,我们需要创建一个QGraphicsView和QGraphicsScene,并将自定义图形项添加到场景中:
```cpp
#include <QGraphicsView>
#include <QGraphicsScene>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView view;
QGraphicsScene scene;
MyItem item;
scene.addItem(&item);
view.setScene(&scene);
view.show();
return a.exec();
}
```
这个示例中,我们创建了一个QGraphicsView和QGraphicsScene,并将自定义图形项添加到场景中。最后,我们将视图设置为场景,并显示视图。