Mauszeiger: on enter // on exit

Alles rund um die Programmierung mit Qt
Antworten
Aliobaba
Beiträge: 4
Registriert: 14. Juli 2010 13:51

Mauszeiger: on enter // on exit

Beitrag von Aliobaba »

Hallo,

Ich beschäftige mich erst sehr kurz mit QT. Nachdem ich mit der Suchfunktion hier und auch bei Google nicht fündig geworden bin, erlaubt bitte eine kurze Frage:

Gibt's in QT (QT-Creator) auch das Maus-Ereignis 'on enter' oder 'on exit', so dass sich 'etwas ereignet', wenn die Maus zum Beispiel über ein Textfeld geführt wird. Mir ist klar, dass die Mausposition abgerufen werden kann und mit der Position dieses Textfeldes verglichen werden kann. Aber wenn das Textfeld in Form und Lage durch den Anwender veränderbar ist, wird diese Vorgehensweise relativ kompliziert.

AlioBaba
Nvidia
Beiträge: 238
Registriert: 22. Februar 2010 21:23

Beitrag von Nvidia »

http://doc.qt.nokia.com/4.6/qwidget.html#mouseMoveEvent
analog mouseReleaseEvent

dafür musst du dein Textfeld subclassen und eine Methode, wie oben anlegen. In die Methode schreibst du was er tun soll.
und am Anfang der Methode wäre noch setMouseTracking(true); gut

gruß nvidia
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

mouseMoveEvent bringt nix, mouseRelease ist der mouseButton ;)
Die korrekten Events wären enterEvent() und leaveEvent(). Um an die ranzukommen muss man aber nicht unbedingt ableiten, für solche simplen Sachen gibt es eventFilter(). Die Doku zu QObject::eventFilter() gibt gleich ein schönes Beispiel mit :)
Aliobaba
Beiträge: 4
Registriert: 14. Juli 2010 13:51

Beitrag von Aliobaba »

Oh je; für jemand, der von Delphi kommt und bisher nur so kleine Allerweltsprogrämmchen geschrieben hat, sind diese Tips schon recht schwere Kost.

Aber ich möchte gerne da durch:
Gibt's für die genannten Tips irgendwo einen Beispielcode?
Nvidia hat geschrieben:dafür musst du dein Textfeld subclassen und eine Methode, wie oben anlegen. In die Methode schreibst du was er tun soll.
und am Anfang der Methode wäre noch setMouseTracking(true); gut
gruß nvidia
Aliobaba
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Zum eventFilter gibt es ein schönes Beispiel in der Doku zu QObject::eventFilter.

Die ganzen *Event-Funktionen musst du selber nur implementieren. Um das Aufrufen kümmert sich dann Qt.
Wenn der User auf deinem Widget eine Maustaste drückt, "sieht" das Qt (da ist das darunterliegende Window-System involviert, z.B. X11 unter Linux) und schickt dem Widget das passende Event (QMouseEvent mit passendem button(), am Ende landet das in mousePressEvent()).

Du willst jetzt abfangen, wenn die Maus das Widget "betritt" -> QEvent::Enter.
Du hast zwei Möglichkeiten: wenn dein Widget öfters verwendet werden soll, und durch deine spezielle neue Funktion einzigartig wird, ist ein Ableiten gerechtfertigt. In der neuen Klasse (z.B. class MyLineEdit : public QLineEdit) kannst du jetzt das enterEvent() implementieren, dort einfach den Code ausführen der beim mouseEnter "passieren" soll.

Code: Alles auswählen

void MyLineEdit:: enterEvent( QEvent* /*e*/ ) {
    qDebug() << "Hui, Eindringling! Fremde Maus eliminieren!";
}
Da solche Sachen manchmal nur an genau einer STelle gebraucht werden, lohnt sich Ableiten nicht wirklich, da kannst du mit eventFilter arbeiten:

Code: Alles auswählen

class MainWindow : public QMainWindow {
    Q_OBJECT
    QLineEdit* lineEdit;
protected:
    bool eventFilter( QObject* obj, QEvent* e );
public:
    MainWindow();
};

MainWindow::MainWindow() {
    lineEdit = new QLineEdit( this );
    lineEdit->installEventFilter( this );
}

bool MainWindow::eventFilter( QObject* obj, QEvent* e ) {
    if( obj == lineEdit && e->type() == QEvent::Enter ) {
        qDebug() << "Hui, Eindringling! Fremde Maus in meinem LineEdit!";
    }
    return QMainWindow::eventFilter(obj, e);
}
Ich hoffe es ist jetzt ein bisschen klarer, wenn nicht sag wo der Schuh drückt.
Aliobaba
Beiträge: 4
Registriert: 14. Juli 2010 13:51

Beitrag von Aliobaba »

Hallo franzf,

na ja; ich kenne kaum eine Stelle, wo der Schuh nicht drückt :? Und mir ist auch klar, dass ich mich hier noch seehr zurückhalten muß: http://qtforum.de/forum/viewtopic.php?t=6807

Trotzdem Danke für Deine Geduld und Deine aufmunternden Worte! Ich muß mich wirklich noch ein wenig in C++ und QT einarbeiten, aber es ist nicht ganz so einfach, im Internet gute Literatur zu QT zu finden. (Tips?)

Dein Code-Beispiel werde ich noch sehr genau durcharbeiten; was mich halt irritiert ist, dass dieses Event (Mouse_Enter und Mouse_Leave [ohne gedrückte Mouse-Taste]) im QT-Creator nicht angeboten wird, wenn man auf einem textBrowser- oder listView-Feld rechtsklickt und den Menüpunkt 'Slot anzeigen...' anwählt. (Bei Sharp-Develop werden hier zum Beispiel wesentlich mehr Mouse-Events 'angeboten'.)

Aliobaba
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Aliobaba hat geschrieben:was mich halt irritiert ist, dass dieses Event (Mouse_Enter und Mouse_Leave [ohne gedrückte Mouse-Taste]) im QT-Creator nicht angeboten wird, wenn man auf einem textBrowser- oder listView-Feld rechtsklickt und den Menüpunkt 'Slot anzeigen...' anwählt. (Bei Sharp-Develop werden hier zum Beispiel wesentlich mehr Mouse-Events 'angeboten'.)
Das liegt ganz einfach daran, dass SIGNAL/SLOT ein anderer Mechanismus ist als "normales" Event-Handling. Ein event ist dazu da, eigenes Verhalten bei bestimmten, definierten Interaktion zu erledigen (eben Maus rein/raus, Tastaturtaste drücken, usw). SIGNAL/SLOT nimmst du für dynamische Verbindungen zwischen Ereignissen und entsprechenden Reaktionen: ein bestimmter Button soll bei einem "clicked()" eine Aktion "oeffneDateiauswahlDialog()" starten; gleichzeitig soll die aktuelle Tabelle komplett geleert (z.B. QTableWidget::clear()) werden. ->

Code: Alles auswählen

connect( button, SIGNAL(clicked()), SLOT(oeffneDateiauswahlDialog()));
connect( button, SIGNAL(clicked()), tableWidget, SLOT(clear()));
Zum Thema C++ gibt es Tutorials im Internet, welche aber nur im allerallergrößten Notfall genommen werden sollten (meist sind die nicht so dolle), für die C++-Grundlagen solltest du dir ein Buch anschaffen (Der C++ Primer ist ein recht gutes, gibts als eBook). Umsonst kenn ich nur "thinking in C++", und das ist auf Englisch - wenn du das einigermaßen verstehst sollte das ganz gut gehen!

Für Qt braucht es kein Buch (es gibt welche, die aber mehr oder weniger die Doku auf Deutsch sind ;)). Die Doku ist Klasse, und es kommen richtig viele Beispielprogramme mit (wurden mitinstalliert).
Antworten