Update eines GraphicViews

Alles rund um die Programmierung mit Qt
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Update eines GraphicViews

Beitrag 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.
Dateianhänge
vorher.png
vorher.png (464 Bytes) 1680 mal betrachtet
nachher.png
nachher.png (484 Bytes) 1680 mal betrachtet
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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?
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag 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);

}
Dateianhänge
ansicht, vor und nach der Betätigung des Buttons
ansicht, vor und nach der Betätigung des Buttons
Bildschirmfoto.png (18.06 KiB) 1653 mal betrachtet
Antworten