PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT: QMouseEvent::LeftButton



jwebworks
21-04-2003, 18:52
Hallo, Leute,

ich arbeite mich gerade durch das Buch "Programming with QT"
aus dem O'Reilly-Verlag. Da gibt es eine Übung in der man
ein Programm schreibt, in dem man in einem Fenster zeichnen
kann.

Es gibt da eine Übung, die nicht so richtig funktioniert. Ich
poste die betreffende Funktion mal:



void ScribbleWindow::mouseMoveEvent( QMouseEvent* event )
{

// create QPainter object for drawing onto the window
QPainter windowpainter;

// and another QPainter object for drawing into an off-screen pixmap
QPainter bufferpainter;

// start painting
windowpainter.begin ( this );
bufferpainter.begin ( &_buffer );

if ( event->button() == QMouseEvent::LeftButton )
{
// draw a line in both the window and the buffer
windowpainter.drawLine ( _last, event->pos() );
bufferpainter.drawLine ( _last, event->pos() );
}

// done with painting
windowpainter.end();
bufferpainter.end();

// remember the the current mouse position
_last = event->pos();
}


Ich möchte in der obigen Funktion abfragen, ob beim
Zeichnen die Linke Maustaste benutzt wurde. Leider
zeichnet er mir, sobald ich die Bedingung mit der Event-
Abfrage einbaue nicht mehr im Fenster. Lasst ich es weg,
dann funktioniert es wieder.

Habe ich einen Fehler drin, den ich nicht sehe?
Mache ich was falsch?

cu, stop.h

tuxipuxi
21-04-2003, 19:09
hi,

ersetze mal:



if ( event->button() == QMouseEvent::LeftButton )


durch:



if( event->button() == Qt::LeftButton )


.. dann sollte es gehen.

siehe auch:
http://doc.trolltech.com/3.1/qt.html#ButtonState-enum


gruss ,

tuxipuxi.

jwebworks
21-04-2003, 20:20
Den Teil habe ich auch schon gelesen.
In der Dokumentation zu QMouseEvent->button()
sind auch Links zu Beispiel-Implementationen aus
dem Tutorial.

Ich kann ja mal den gesamten Quelltext posten.

jwebworks
21-04-2003, 22:28
Ich habs gefunden. Im Anhang des Buches waren sogar
Lösungen gedruckt :D



if ( event->state() & LeftButton ) {
...
}



Wäre die richtige Lösung gewesen. In der qt3-Doc
war es aber anders angegeben. Komisch.

cu, stop.h

tuxipuxi
22-04-2003, 08:21
fuehrst du hier irgendwie einen monolog? meine antwort tut genau das was du willst
*kopfschuettel*

jwebworks
22-04-2003, 09:18
Hehe, sorry, nein kein Monolog.

Ich wollte mit meiner ersten Antwort sagen:

Das habe ich schon ausprobiert, aber das hat nicht
funktioniert. Was recht seltsam ist, weil Trolltech
das in seinen Tutorials auch benutzt.

cu, stop.h

anda_skoa
22-04-2003, 09:28
Original geschrieben von jwebworks
Das habe ich schon ausprobiert, aber das hat nicht
funktioniert. Was recht seltsam ist, weil Trolltech
das in seinen Tutorials auch benutzt.


Die beiden Sachen sind nicht das selbe, es komt drauf an, was man wissen will.
QMouseEvent::button() ist der Button, der das Event ausgelöst hat, zB mit dem geklickt wurde.

QMouseEvent::state() ist eine OR-Verknüpfung aller Buttons, die schon gedrückt waren.

Ein Move Event wird nicht von einem Button ausgelöst, sondern durch Bewegung der Mouse. Da hat button() wenig Sinn.

Ciao,
_

jwebworks
22-04-2003, 09:44
Laut Doku wird das mouseMoveEvent nur ausgelöst,
wenn ein Button gedrückt wurde. Es sei denn
setMouseTracking (true) wurde gesetzt.

Das Beispielprogramm ist ein Zeichenprogramm.
Wenn der linke Mausbutton gedrückt wurde, dann
soll auf dem Fenster eine Linie gezeichnet werden.

Im mousePressEvent wird dazu die Startposition
der Maus in _last gespeichert und im mouseMoveEvent
wird eine Linie von _last zu event->pos() gezeichnet.

Welche Events kämen alternativ dazu in Frage?
Wird QMouseEvent::button() in mousePressEvent nicht gesetzt?

anda_skoa
22-04-2003, 09:48
Original geschrieben von jwebworks

Das Beispielprogramm ist ein Zeichenprogramm.
Wenn der linke Mausbutton gedrückt wurde, dann
soll auf dem Fenster eine Linie gezeichnet werden.


Wenn du ohnehin nur bei Klick zeichen willst, warum benutzt du dann das Move Event?



Welche Events kämen alternativ dazu in Frage?


mousePressEvent



Wird QMouseEvent::button() in mousePressEvent nicht gesetzt?


Doch, natürlich, schliesslich kann ein PressEvent nur durch einen Button ausgelöst werden.

Ciao,
_

jwebworks
22-04-2003, 13:30
Hehe. Ich habe das so gemacht, weil ich Qt gerade erst
lerne und es in dem Buch (siehe oben) so gemacht wurde.

Wahrscheinlich war es übersichtlicher und einfacher, es einem
Anfänger so zu zeigen. Ich weiss es nicht.

Wie würde denn eine passende Lösung aussehen?

Ich spinne mal:

--<spinn on>--
Ich frage den Button im mousePressedEvent ab und
speichere den Startpunkt

Zeichne die Linien von Punkt zu Punkt aber weiterhin
im mouseMovedEvent. Also sobald die Maus bewegt wird,
zeiche ich eine Linie vom Startpunkt zum neuen Startpunkt.

...
--<spinn off>--

Wird das mousePressedEvent nur einmal ausgelöst, oder
ständig, wenn der Mausbutton gedrückt wurde und die Maus
wie ein Pinsel bewegt wird?

cu, stop.h

anda_skoa
23-04-2003, 19:21
Original geschrieben von jwebworks

Ich frage den Button im mousePressedEvent ab und
speichere den Startpunkt

Zeichne die Linien von Punkt zu Punkt aber weiterhin
im mouseMovedEvent. Also sobald die Maus bewegt wird,
zeiche ich eine Linie vom Startpunkt zum neuen Startpunkt.


Du könntest dann beim Release Event die Linie finalisieren.



Wird das mousePressedEvent nur einmal ausgelöst, oder
ständig, wenn der Mausbutton gedrückt wurde und die Maus
wie ein Pinsel bewegt wird?


Einmal.
Wie gesagt, gibt es ein pressEvent immer wenn ein Button gedrückt wird.

Ciao,
_