Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QGraphicscene::clear不';不要改变气味_C++_Qt_Qgraphicsview_Qgraphicsscene - Fatal编程技术网

C++ QGraphicscene::clear不';不要改变气味

C++ QGraphicscene::clear不';不要改变气味,c++,qt,qgraphicsview,qgraphicsscene,C++,Qt,Qgraphicsview,Qgraphicsscene,我有一个QGraphicscene“场景”和QGraphicsView“graphicsView” 我有画法。当我需要重画所有的图形时,我调用这个方法。一切都好。但我意识到scene->clear()不会改变场景 我也试过: graphicsView->items().clear(); scene->clear(); graphicsView->viewport()->update(); 在那之后,如果我在 QRectF bound = scene->sceneR

我有一个QGraphicscene“场景”和QGraphicsView“graphicsView”

我有画法。当我需要重画所有的图形时,我调用这个方法。一切都好。但我意识到scene->clear()不会改变场景

我也试过:

graphicsView->items().clear();
scene->clear();
graphicsView->viewport()->update();
在那之后,如果我在

QRectF bound = scene->sceneRect();
qDebug() << bound.width();
qDebug() << bound.height();
虽然我完全清除了场景,只添加了一个相当小的矩形,但由于场景太大,矩形不适合视图


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

更好的问题是为什么需要设置场景矩形?如果你有一个较小的场景,不要设置它。而是将项目添加到场景中,并基于项目边界矩形调整视图,如下面的示例所示:

#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);
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
#包括
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
_场景=新的Qgraphicscene(此);
ui->graphicsView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
ui->graphicsView->setScene(_场景);
连接(ui->按钮,信号(released()),此,插槽(_handleRelease());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
int主窗口::_随机(int最小值,int最大值)
{
返回qrand()%((最大+1)-min)+min;
}
void主窗口::_handleRelease()
{
_场景->清除();
QGraphicsRectItem*pRect1=_scene->addRect(0,0,_random(50100),_random(50100));
qgraphicsrecitem*pRect2=\u scene->addRect(0,0,\u random(20,50),\u random(20,50));
pRect1->setPos(QPoint(40,40));
pRect2->setPos(QPoint(20,20));
ui->graphicsView->fitInView(_scene->itemsBoundingRect(),Qt::KeepAspectRatio);
}
如果您有一个包含数百个项目的大型场景,这种方法会很慢,因为:

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

从(我的)重点:

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

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

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


因此,收缩
场景竖立
的唯一方法是使用
设置场景竖立

使用graphicsView->fitInView(场景->项目边界rect())而不是graphicsView->fitInView(场景->场景竖立())解决了我的问题。但这个数字仍然太大。删除项目不会更改设置。我想这个问题将来会给我带来一些问题:)@mehmetfa场景创建后不需要设置场景矩形。如果未设置,则将始终根据内部项目的边框进行计算。您是否尝试删除设置场景矩形的行?@mehmetfa如果您的问题已解决,请将问题标记为已解决。实际上,我没有设置场景矩形。正如你所说,它是根据里面的物品计算的。但它总是通过添加而增长,而不是通过删除项目而减少。只有scene->itemsBoundingRect通过删除项目而减少。@mehmetfa这很奇怪。在我的示例中,场景矩形保持不变,大小不会增加。
#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);
}