Cursor in Widget festhalten

Alles rund um die Programmierung mit Qt
Antworten
TheClerk
Beiträge: 23
Registriert: 21. Oktober 2009 14:16

Cursor in Widget festhalten

Beitrag von TheClerk »

Hallo,

ich habe zwei Fragen zum Umgang mit dem Mousecursor in Qt. Ich konnte leider hier im Forum oder in der Doku nichts finden, aus dem ich wirklich schlau geworden bin.

Gibt es bei Qt eine Funktion, mit der ich dafür sorgen kann, dass der Mauszeiger gewisse widgets nicht verlassen kann? Also wenn er den Rand eines Widgets erreicht, kann man die Maus soviel bewegen, wie man will aber es geht nicht weiter.

Wenn ich das Prinzip von QGraphicItems, -Scene und -View richtig verstanden habe, ist die Scene quasi meine Datenstruktur, in der alles geordnet wird. Die Items sind sozusagen meine Datensätze, die ich dort einfüge. Das QGraphicsView ist dann nur noch dazu da, dass ich mir das ganze auch anschauen kann. Soweit so gut.

Wenn ich nun mit der Maus etwas anklicken möchte, macht es wahrscheinlich Sinn, bei den Items entsprechende EventHandler zu überladen. Wenn ich mir aber zum Beispiel die Cursorkoordinaten ausgeben lassen möchte, wo mache ich das am besten? Ich dachte es wäre am sinnvollsten, wenn ich das über den GraphicsView mache und dann die Koordinaten für die Scene umrechne. Das klappt aber leider auch noch nicht so, wie es soll.

Was ich jetzt also im Klartext gerne wüsste: Wie geht man bei Qt anständig mit der Maus um? :)

Grüße und sorry für diese schwammige Frage aber ich wüsste sie leider nicht besser zu formulieren...
TheClerk
Beiträge: 23
Registriert: 21. Oktober 2009 14:16

Beitrag von TheClerk »

Okay, das mit den EventHandlern habe ich soweit hinbekommen. Bleibt noch die Frage: Kann ich den Cursor daran hindern ein Widget (In meinem Fall ein QGraphicsView) zu verlassen?
Ich würde es gerne so einrichten, dass wenn der Cursor an den Rand bewegt wird, scrolling betrieben wird. Dazu habe ich auch schon code geschrieben, der zwar leidlich funktioniert aber nicht ganz das ist, was ich mir vorstelle:

[code]
void MapView::mouseMoveEvent(QMouseEvent *event){
if (event->x() >= this->width() - 50){
this->cursor().setPos(this->width(), event->y());
QPointF newCenter = currentCenter();
centerOn(newCenter.x() + this->width()/10, newCenter.y() + this->height()/10);
}
}[/code]

Gibt es da keine Möglichkeit, das eleganter zu machen? Sieht der code nur bei mir so bescheiden aus, oder muss ich da in meinen Foreneinstellungen was ändern?
Antworten