Seite 1 von 1

Update eines GraphicViews

Verfasst: 31. Mai 2010 23:21
von anno1988
Hallo,

ich habe ein Problem bei einem Update eines graphicViews.

Code: Alles auswählen


QGraphicsScene *scene = new QGraphicsScene();
QGraphicsView *view = new QGraphicsView();

view->setScene(scene);
scene->setSceneRect(0, 0, 50, 50);
scene->addRect(0, 0, 50, 50);

Wie man im Bild vorher sehen kann, ist das rechteck im GraphicsView zentriert. So soll es auch sein.

Danach mache ich ein Update der GraphicsScene im View, allerdings wird die Position da nicht neu gesetzt (sie sollte normal an der linken oberen Ecke sein) sondern bleibt die alte.

Code: Alles auswählen


scene->clear();
scene->update(0, 0, 200, 50);
scene->addRect(0, 0, 200, 50);
view->updateSceneRect(QRect(0, 0, 200, 50));

Wie man hier auf dem Bild sehen kann, wird die Position der Scene nicht neu gesetzt. Normalerweise sollte die Position des neu erstellten Rechtecks ebenfalls zentriert sein.

Verfasst: 1. Juni 2010 08:50
von franzf
Ich kann dein Problem hier leider nicht nachvollziehen. Jedenfalls nicht, wenn das sceneRect korrekt gesetzt ist ;)
Aber warum scene.clear() wenn du auch rectItem.setRect() machen kannst?
Und das sceneRect setzen ist nicht immer eine gute Idee, denn normalerweise berechnet die scene automatisch die richtige Größe. Bei setSceneRect() musst du dich dann immer selber um die richtige Größe kümmern. Und genau da hapert es, denke ich.
Kannst du nicht mal ein minimales kompilierbares Beispiel posten, das dein Problem zeigt?

Verfasst: 1. Juni 2010 08:52
von solarix
Mir ist nicht klar, warum du nicht mit den Items arbeitest aber na gut.. wie siehts denn mit

Code: Alles auswählen

scene->clear(); 
scene->setSceneRect(0, 0, 200, 50);
scene->addRect(0, 0, 200, 50); 
aus?

Verfasst: 1. Juni 2010 21:37
von anno1988
ich habe hier nochmal ein anderes Beispiel.

Code: Alles auswählen


#include <QMainWindow>
#include <QGraphicsScene>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

protected:
    void changeEvent(QEvent *e);
		QGraphicsScene *scene;

private:
    Ui::MainWindow *ui;

	private slots:
		void click123();
};



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

		scene = new QGraphicsScene();
		scene->addRect(0, 0, 400, 50);

		ui->graphicsView->setScene(scene);

		connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(click123()));

}

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

void MainWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void MainWindow::click123() {

	scene->clear();

	scene->addRect(0, 0, 200, 50);

ui->graphicsView->setScene(scene);

}


Auf dem Bild sieht man , wie es aussieht, wenn ich das erste mal etwas ins GraphicView einbinde und anschließend nach dem Drücken des Buttons.
Ich würde hier einfach erwarten, dass auch im 2. Fenster das rechteck zentriert ist, was aber nicht der Fall ist.

Das verstehe ich ncith, warum das nicht wieder zentriert wird.

Doch sobald ich das rechteck größer als das vorherige mache, wird es wieder zentriert.

Code: Alles auswählen



void MainWindow::click123() {

   scene->clear();

   scene->addRect(0, 0, 500, 50);

ui->graphicsView->setScene(scene);

}