Seite 1 von 1
Window und Viewport
Verfasst: 30. November 2006 09:37
von skoehler
Hallo,
sehr schön finde ich die Möglichkeit, die Umrechnung vom internen Koordinatensystem auf den gerade aktuellen Viewport durch Qt erledigen zu lassen. Einfach setWindow(x,y,w,h) aufrufen und alles geschieht automatisch.
Aber wie geht der umgekehrte Weg? Wenn ich mit der Maus in den Viewport klicke, möchte ich die Werte in meinem Koordinatensystem. Es gibt zwar die Methode QPainter::map() aber keine Umkehrung dazu.
Danke
Steffen
Verfasst: 30. November 2006 11:11
von macman
Welches Qt? Bei mir hat QPainter keine map()-Funktion. Ansonsten guck mal durch die ganzen mapTo-Funktionen.
Verfasst: 30. November 2006 12:23
von skoehler
Ich verwende Qt 4.3.1.
Entschuldigung, ich meinte die map-Funktion von QMatrix.
Allerdings komme ich bei einem Klick-Event gar nicht an der QPainter ran, weil Qt sagt:
Code: Alles auswählen
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setWindow(), painter not active
Jetzt könnte ich mir den Punkt natürlich ohne Probleme aus den Abemssungen des Widgets und meinen Window-Werten ausrechnen.
Aber ich hoffe es gibt genau so einen eleganten Rückweg, wie es zum Viewport hin gibt.
Steffen
Verfasst: 30. November 2006 14:59
von macman
skoehler hat geschrieben:Ich verwende Qt 4.3.1.
Wo gibt es die denn? Heute ist doch grade mal 4.2.2 rausgekommen
skoehler hat geschrieben:Jetzt könnte ich mir den Punkt natürlich ohne Probleme aus den Abemssungen des Widgets und meinen Window-Werten ausrechnen.
Wenn dir mapToParent() nicht reicht, wirst Du das wohl machen müssen. Ehrlich gesagt weiß ich immer noch nicht was Du willst. Du klickst in ein Widget und möchtest die absoluten Koordinaten von was?
Verfasst: 30. November 2006 17:38
von skoehler
Ich möchte graphische Daten anzeigen und habe aus diesem Grund ein Weltkoordinaten- (WKS) und ein Bildschirmkoordinatensystem (BKS).
Angenommen mein Programm zeichnet nur Elemente im x- bzw. y-Bereich von 0 bis 1. Zeige ich diese Elemente an, bekomme ich einen Punkt in der oberen Ecke. Deshalb setze ich das Window:
Code: Alles auswählen
void viewport::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setPen(Qt::blue);
painter.setWindow(0,0,1,1);
painter.drawLine(0,0,1,1);
painter.drawLine(QPointF(0.5,0.5),QPointF(1,0));
}
Qt zeichnet mir damit immer eine Diagonale und eine halbe Diagonale in mein Widget, egal wie der Nutzer es verändert. Im Hintergrund wird eine Transformationsmatrix erzeugt.
Klicke ich jetzt in das Widget möchte ich einen Wert zwischen 0 und 1 erhalten und nicht die Pixelwerte des Widgets. mapToParent rechnet nur die Pixelposition bezogen auf das Vaterwidget aus.
Ich hatte gehofft das dieser Rückweg genau so elegant geht wie der Weg vom WKS zum BKS.
Steffen