Window und Viewport

Alles rund um die Programmierung mit Qt
Antworten
skoehler
Beiträge: 12
Registriert: 24. Mai 2006 13:01
Wohnort: Jena

Window und Viewport

Beitrag 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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag von macman »

Welches Qt? Bei mir hat QPainter keine map()-Funktion. Ansonsten guck mal durch die ganzen mapTo-Funktionen.
skoehler
Beiträge: 12
Registriert: 24. Mai 2006 13:01
Wohnort: Jena

Beitrag 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
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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?
skoehler
Beiträge: 12
Registriert: 24. Mai 2006 13:01
Wohnort: Jena

Beitrag 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
Antworten