Zoom Okay, FitInView will nicht

Alles rund um die Programmierung mit Qt
Antworten
DoktorAgony
Beiträge: 6
Registriert: 8. Oktober 2013 12:21

Zoom Okay, FitInView will nicht

Beitrag von DoktorAgony »

Hallo, ich schon wieder.
Diesmal einen Schritt weiter. Nun will ich die drei Ansichten, die ich mit QGraphicsView/Scene produziert angezeigt bekomme, verändern.
Und zwar will ich mit Hilfe von unterschiedlichen Buttons (+ und - ) rein, bzw. rauszoomen, die Ansicht in der Ursprünglichen Normalen geladenen Größe darstellen und in den angesetzten Rahmen der Scene eipassen (also Fit in View).

Das Zoomen funktioniert hervorragend und habe ich hiermit gut gelöst:

Code: Alles auswählen

void MainWindow::zoomInV() //Reinzoomen der Vorderansicht [Analog dazu gibts auch den Zoom in Seitenansicht und Draufsicht]
{
    ui->graphicsView_Vorder->scale(1.05, 1.05);  
}

void MainWindow::zoomOutV() //Rauszoomen der Vorderansicht [Analog dazu gibts auch den Zoom in Seitenansicht und Draufsicht]
{
    ui->graphicsView_Vorder->scale(1/1.05, 1/1.05); //Das mit dem Bruch und der entsprechenden Genauigkeit hatte ich schon rausgefunden
}
Fehlt nur noch das Problem mit dem Fit in View und der Normalen (Ursprünglichen) Bildgröße

Ich dachte, ich wäre mal schau und würde den Befehl "Fit in View" nutzen, allerdings funktioniert das ganze nur bedingt.
Erstens: Egal wie groß das geladene Bild ist, ein Klick auf Fit in View bewirkt nichts. Das ganze reagiert erst dann, wenn ich mindestens einmal am Zoom gearbeitet hab (also einmal + oder - gedrückt). Dann reagiert das Fit in View, aber nicht wirklich. Es skaliert, aber nicht nachvollziehbar, wieso nicht vollständig in den Rahmen hinein.

Geöffnet wird das Bild hiermit http://www.qtforum.de/forum/viewtopic.p ... 054#p76810

Und das ist der Code-Schnipsel, der eigentlich funktioniert, aber nur wenn ich das Bild grade öffne. Danach will der Befehl nicht mehr reagieren.
Ausprobiert habe ich das ganze mit einem Bild, was über mein Ansichtsfenster heraus geht und auch mit einem Bild, das kleiner ist als das Fenster.
Beides geht so nicht.

Code: Alles auswählen

void MainWindow::fitToWindowVorder()
{
     ui->graphicsView_Vorder->fitInView(scene_v->sceneRect(), Qt::KeepAspectRatio); //Einpassen in den Graphikrahmen
}
Und vollständig planlos bin ich im Moment noch mit der Anzeige der "Ursprünglichen Ansicht".

Code: Alles auswählen

void MainWindow::normalSizeVorder()
{
//Planlosigkeit macht sich breit...
}
Ich habe schon das Internet und viele Bücher nach einer Idee duchforstet. Ich habe mir die 4000 Chips angesehen und auch das Bildbetrachter-Beispiel. Von letzterem habe ich das mit dem Zoomen. Aber bei den anderen beiden Ansichten, da hängts grade.

Hat noch jemand einen Vorschlag, wo ich nachschauen könnte um auf eine Lösung zu kommen?
DoktorAgony
Beiträge: 6
Registriert: 8. Oktober 2013 12:21

Re: Zoom Okay, FitInView will nicht

Beitrag von DoktorAgony »

Ich bumpe noch mal hoch... Ich wühle mich seit Tagen durch Codes durch und nichts will funktionieren.

Ich hatte es noch hiermit versucht, aber einmal Klicken und dann kein Zoom mehr.

Code: Alles auswählen

void MainWindow::zoomInVorder()
{
QMatrix matrix;
matrix.scale(1.05, 1.05);
ui->graphicsView_Vorder->setMatrix(matrix);
}
Ja, nölt mich auch an, dass ich was vergessen habe oder mich mit XYZ beschäftigen müsste. Selbst solch einen Hinweis würde ich mit Kusshand nehmen.
Aber gebt mir doch wenigstens einen Tipp. :oops:
Ich hab nicht nur dieses Forum durchforstet, und all die anderen englischsprachigen Foren,... nein ich hab sogar auf Französich und Russisch gesucht, src-Plattformen durchgekramt und was nicht alles. Ich versteh meinen Fehler nicht und möchte einfach nur einen einzigen Hinweis.
Kann sich denn keiner erbarmen?
Ich würd ja liebend gern auf die Trolltech-Seiten zugreifen, aber die sind ja mittlerweile tot.
Hilfe. Bild
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: Zoom Okay, FitInView will nicht

Beitrag von odt »

Hallo
Auf die Schnelle...
Die SceneRect könnte "schepp's" sein. Versuch mal diese beim Laden des Bildes (oder was Du anzeigst) auf der Scene zu setzen.
Betreffend dem Fit scheinst Du es ähnlich wie ich zu machen... Da bei der Initialisierung der View diese noch keine Grösse hat, bringt ein fitInView in Constructor nicht viel. Darum und damit die Skalierung beim Aendern der Fenstergrösse stimmt, rufe ich beim Resize den fitInView auf.

Code: Alles auswählen

	class GraphicsView : public QGraphicsView {
	public:
		enum FitMode {
			FitWidth,
			FitHeight,
			FitContent,
			NoFit
		};
	private:
		FitMode _fitMode;
	...
	void GraphicsView::zoomOut()
	{
		setFitMode( NoFit );
		qreal s = 0.8;
		scale(s,s);
	}
	void GraphicsView::zoomIn()
	{
		setFitMode( NoFit );
		qreal s = 1.2;
		scale(s,s);
	}
	void GraphicsView::fitContent()
	{
		setFitMode( FitContent );
	}
	void GraphicsView::setFitMode(GraphicsView::FitMode fitMode){
		_fitMode = fitMode;
		refit();
		refreshActions();
	}
	void GraphicsView::resizeEvent(QResizeEvent* event)
	{
		QWidget::resizeEvent( event );
		if( !QMetaObject::invokeMethod( this, "refit", Qt::QueuedConnection ) ){
			ASSERT( false );
		}
	}

	void GraphicsView::refit()
	{
		if( !scene() ) return;
		if( _fitMode == FitWidth ){
			QRectF rect = scene()->sceneRect();
			rect.setTop( rect.y() );
			rect.setHeight( 2 );
			fitInView( rect, Qt::KeepAspectRatio );
		} else if( _fitMode == FitHeight ){
			QRectF rect = scene()->sceneRect();
			rect.setLeft( rect.center().x() -1 );
			rect.setWidth( 2 );
			fitInView( rect, Qt::KeepAspectRatio );
		} else if( _fitMode == FitContent ){
			fitInView( scene()->sceneRect(), Qt::KeepAspectRatio );
		} else {
		}
	}
ODT Informatik GmbH, Reto Tschofenig
Antworten