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
Mauszeiger: on enter // on exit
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
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
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
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
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?
Aber ich möchte gerne da durch:
Gibt's für die genannten Tips irgendwo einen Beispielcode?
AliobabaNvidia 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
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.
Da solche Sachen manchmal nur an genau einer STelle gebraucht werden, lohnt sich Ableiten nicht wirklich, da kannst du mit eventFilter arbeiten:
Ich hoffe es ist jetzt ein bisschen klarer, wenn nicht sag wo der Schuh drückt.
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!";
}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);
}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
na ja; ich kenne kaum eine Stelle, wo der Schuh nicht drückt
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
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. ->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'.)
Code: Alles auswählen
connect( button, SIGNAL(clicked()), SLOT(oeffneDateiauswahlDialog()));
connect( button, SIGNAL(clicked()), tableWidget, SLOT(clear()));Für Qt braucht es kein Buch (es gibt welche, die aber mehr oder weniger die Doku auf Deutsch sind