2014-04-11

Mouse cursor centered zooming in QGraphicsView

Zooming into and out of a QGraphicsView so that the position under the mouse cursor remains fixed is easy, right? Sadly, it isn't. I leave my best working approach here for you to enjoy and hopefully save you some time.

Before coming up with this, I browsed the interwebs and tried a few other things. I always ended up with not-working code or a slight drift while repeatedly zooming.

void GraphicsView::wheelEvent(QWheelEvent* e) {
        if ((e->modifiers()&Qt::ControlModifier) == Qt::ControlModifier
                        && e->angleDelta().x() == 0) {

                QPoint  pos  = e->pos();
                QPointF posf = this->mapToScene(pos);

                double by;
                double angle = e->angleDelta().y();

                if      (angle > 0) { by = 1 + ( angle / 360 * 0.1); }
                else if (angle < 0) { by = 1 - (-angle / 360 * 0.1); }
                else                { by = 1; }

                this->scale(by, by);

                double w = this->viewport()->width();
                double h = this->viewport()->height();

                double wf = this->mapToScene(QPoint(w-1, 0)).x()
                                - this->mapToScene(QPoint(0,0)).x();
                double hf = this->mapToScene(QPoint(0, h-1)).y()
                                - this->mapToScene(QPoint(0,0)).y();

                double lf = posf.x() - pos.x() * wf / w;
                double tf = posf.y() - pos.y() * hf / h;

                /* try to set viewport properly */
                this->ensureVisible(lf, tf, wf, hf, 0, 0);

                QPointF newPos = this->mapToScene(pos);

                /* readjust according to the still remaining offset/drift
                 * I don't know how to do this any other way */
                this->ensureVisible(QRectF(QPointF(lf, tf) - newPos + posf,
                                QSizeF(wf, hf)), 0, 0);

                e->accept();
        }

        if ((e->modifiers()&Qt::ControlModifier) != Qt::ControlModifier) {
                /* no scrolling while control is held */
                QGraphicsView::wheelEvent(e);
        }

}

Any Tipps to make this shorter/better are very much appreciated.

2014-02-04

Unterhaltung

Als mir erklärt wurde dass Spiele der Steam wishlist hinzuzufügen bedeutet dass man eine E-Mail bekommt wenn jenes Spiel im Angebot ist, habe ich das direkt genutzt um (hoffentlich) gute Spiele drauf zu packen damit ich die für wenig Geld mal ausprobieren kann.

Ein sehr schönes Spiel was ich so erworben hab' ist The Stanley Parable. Vielleicht nicht unbedingt 12€ Wert, da ziemlich kurz, aber auf jeden Fall ein sehr "interessantes" und unterhaltsames Werk.


Weiterhin bin ich auch mal durch Mass Effect 1&2 durchgerannt. Für 10€ ein guter Deal. Kurz gesagt ist Mass Effect ist ein stark gehypter 3rd person shooter der viel Wert auf Story und Auswahlmöglichkeiten legt.
Nachdem ich durch beide Spiele in weniger als 40h durch bin, war ich ein wenig enttäuscht, weil die Story nicht super ist (Für Neuere-Videospiel-Verhältnisse aber trotzdem eine der besten) und die übertriebene Dramatik der letzten Mission von Mass Effect 2 mich abgeschreckt hat.
Die letzte Mission war definitiv cool und packend, aber irgendwie hat mir das hinarbeiten auf den Klimax gefehlt. Bis zu dem Punkt war alles recht eintönig. Crew-Mitglieder kennenlernen. Loyalität mit einer einzigen Mission je Mitglied erarbeiten. Upgrades kaufen. Leveln. Usw.
Nach ein bisschen Recherche und Reden mit Freunden musste ich feststellen, dass ich die Auswahlmöglichkeiten und die verschiedenen Versionen der Story unterschätzt habe (z.B. hier das Video der schlimmsten Version der letzten Mission in ME2). Vielleicht spiele ich es demnächst nochmal durch, schlage dabei einen anderen Pfad ein und lass' mir etwas mehr Zeit dabei.
Glänzen können beide Spiele durch gute Charaktere, eine gute Steuerung, eine schöne Inszenierung, super Synchronsprecher und einen absolut genialen Soundtrack. Fazit: Absolut spielenswert.

Teil 3 liegt auch schon bereit. Man will ja wissen wie's weitergeht. Nur habe ich zur Zeit kein DVD-Laufwerk und EA's Steam-Konkurrenz namens Origin werde ich mir hoffentlich nie installieren. Einige EA-Titel wie z.B. Battlefield 4 und Mass Effect 3 sind nicht auf Steam verfügbar sondern nur auf Origin.

Vorgestern ist dann noch Mirror's Edge zur Sammlung, für 2,50€, dazu gekommen. Mirror's Edge ist ein first person shooter mit wenig shooting und setzt den Fokus auf Parkour als Spielemechanik. Nach den ersten paar Missionen muss ich sagen: fetzt. Mal sehen wie's weitergeht.

Zum Abschluss habe ich für alle die, wie ich, das Gefühl haben schon jeden neueren Sci-Fi-Film gesehen zu haben noch eine kleine Empfehlung: The Abyss. Unbedingt die ungeschnittene / non-Hollywood Variante ansehen.

2014-01-21

Qt 5.2 + Android Error #1

If you make a new project and try to debug/run you might get the following error.
Unable to start 'org.qtproject.example._8paint'. Debugging has failed
or
Starting remote process. Unable to start 'org.qtproject.example._8paint'

Notice the extra underscore in front of the program name. Apparently, your program's name is not allowed to begin with a number or an underscore.

edit: This error should be resolved in Qt 5.3

2014-01-17

Lang lebe das Blog


Der letzte Blog-Post liegt drei Monate zurück. Ups. Ich war ziemlich gestresst vom Beleg schreiben.

Mittlerweile ist der Beleg abgegeben, verteidigt und benotet. Alles lief besser als erwartet. Bin sehr zufrieden. Super!

Jetzt, da ich wieder in Wien bin und den Kopf einigermaßen frei habe, werde ich mal die Dinge in Angriff nehmen für die ich keine Nerven hatte. Meinen CV neu machen und auf github laden, Bürokram machen, zum Arzt gehen wegen meiner immernoch anhaltenden Fußverletzung, den Ungelesene-Bücher-Stapel verkleinern, bloggen und generell eigene Interessen verfolgen.

Bin erst ein paar Tage wieder in Österreich. Daher gibt es nichts zu berichten außer dass ich mal ein österreichisches Nationalgetränk ausprobiert habe. Hat, laut Aufdruck, sogar viele Vitamine! Schmeckt aber wie Zuckerwasser ohne definierbaren Geschmack. Nicht so toll.


Im Steam-Weihnachts-Sale habe ich mir Mass Effect 1 und 2, geholt und bisher die 1 durchgespielt und die 2 angefangen. Ziemlich ziemlich gut. Viel Story. Gute Story. Gute Dialoge. Gutes Gameplay. Keine auffälligen/nervigen Macken, abgesehen davon dass jeder Abschnitt komplett schlauchförmig ist. Fetzt.

EvE Online habe ich in letzter Zeit weniger gespielt. Sehenswert ist das folgende Video. Rooks and Kings stellt den remote starburst vor. Capital ships beschleunigen dabei auf 10,000 m/s und spielen Billard!


Vom 5.1. bis 11.1 fand der alljährliche Speedrun-Marathon Awesome Games Done Quick in Washington DC statt. Insgesamt wurde rund eine Million Dollar für die Prevent Cancer Foundation gesammelt. Alle Runs kann man hier finden. Ein paar ausgewählte runs:
  • Mike Tyson's Punchout!! (Ja, mit Ausrufezeichen im Titel), von Sinister1,  mit verbundenen Augen. Genial!


  • Direkt danach kam noch die Steigerung (was ich nicht für möglich gehalten habe bei dem letzten run): Super Punch-Out!!, von Zallard1, mit verbundenen Augen. Spoiler: Er schafft es als erster überhaupt es durchzuspielen!
 

  • Minecraft speedrun! Mit festem seed, FYI. Ich wusste gar nicht, dass man es überhaupt rennen kann. Aber der junge Mann schafft es in unter 30 Minuten den Drachen zu besiegen. link
Von Ghost in the Shell gibt es eine neue übrigens eine neue Prequel-Reihe, die sich damit beschäftigt wie der Major zu Section 9 kommt und sein Team zusammenstellt. Bisher sind zwei Filme veröffentlicht worden. link

Die neue Anime-Season ist armselig, genau wie die Letzte. Viel Schul-Anime, Slapstick-Zeug und schlechte Dialoge. Schade.

Isaac Assimov's sieben Foundation Series-Bücher habe ich fast fertig gelesen. Der Mann hat's schwer drauf. Trotzdem habe ich das Gefühl dass die jungeren Bücher nicht so gut sind wie die ersten paar. Dennoch sehr lesenswert, genau wie die Robot-Geschichten.

Das war's erstmal. Bis demnächst!