QGraphicsScene :: clear不会改变sceneRect

时间:2015-12-24 08:03:14

标签: c++ qt qgraphicsview qgraphicsscene

我有一个QGraphicsScene"场景"和QGraphicsView" graphicsView"。

我有一个绘图方法。当我需要重绘所有图形时,我称之为这种方法。一切都好。但我意识到scene-> clear()并没有改变sceneRect。

我也试过了:

graphicsView->items().clear();
scene->clear();
graphicsView->viewport()->update();

之后,如果我通过

获取sceneRect
QRectF bound = scene->sceneRect();
qDebug() << bound.width();
qDebug() << bound.height();

我希望bound.width和bound.height为&#39; 0&#39;。但他们并不是。我每次都看到以前的值。清除场景本身时如何清除sceneRect?

它提供了一些问题,即sceneRect保持不变,同时使用graphicsView-&gt; fitInView()方法。我使用以下代码:

QRectF bounds = scene->sceneRect();
bounds.setWidth(bounds.width()*1.007);          // to give some margins
bounds.setHeight(bounds.height());              // same as above
graphicsView->fitInView(bounds);

虽然我完全清除了场景并且只添加了一个相当小的矩形,但由于sceneRect仍然太大,因此矩形不适合视图。

我希望我能解释一下我的问题。

2 个答案:

答案 0 :(得分:1)

来自 Qt Docs(强调我的):

<块引用>

该属性保存场景矩形;场景的边界矩形

场景矩形定义了场景的范围。它主要由 QGraphicsView 用于确定视图的默认可滚动区域,并由 QGraphicsScene 用于管理项目索引。

如果未设置,或者如果设置为空 QRectF,sceneRect() 将返回自场景创建以来场景中所有项目的最大边界矩形 (即,当项目添加到或在场景中移动,但从不收缩)

因此,缩小 sceneRect 的唯一方法是使用 setSceneRect

答案 1 :(得分:0)

更好的问题是为什么需要设置场景矩形?如果您有一个较小的场景,请不要设置它。而是根据下面的示例中的项目,将项目添加到场景并适合视图:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsRectItem>
#include <QPointF>
#include <QDebug>
#include <qglobal.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    _scene = new QGraphicsScene(this);
    ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    ui->graphicsView->setScene(_scene);

    connect(ui->button, SIGNAL(released()), this, SLOT(_handleRelease()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

int MainWindow::_random(int min, int max)
{
    return qrand() % ((max + 1) - min) + min;
}

void MainWindow::_handleRelease()
{

    _scene->clear();

    QGraphicsRectItem* pRect1 = _scene->addRect(0, 0, _random(50,100), _random(50,100));
    QGraphicsRectItem* pRect2 = _scene->addRect(0, 0, _random(20,50), _random(20,50));

    pRect1->setPos(QPoint(40,40));
    pRect2->setPos(QPoint(20,20));

    ui->graphicsView->fitInView(_scene->itemsBoundingRect(),Qt::KeepAspectRatio);
}

如果你有一个包含数百个项目的大型场景,这种方法会很慢,因为:

  

如果未设置场景rect,QGraphicsScene将使用边界区域   所有项目,由itemsBoundingRect()返回,作为场景rect。   但是,itemsBoundingRect()是一个相对耗时的函数,   因为它通过收集每个项目的位置信息来操作   现场。因此,您应始终将场景设置为矩形   在大型场景上进行操作。