Ich lerne gerade Qt mit C ++. Ich habe erfolgreich Signale und Slots implementiert, um Standardereignisse wie ButtonPushed()
usw. einzufangen. Allerdings möchte ich eine Funktion haben, die aufgerufen wird, wenn ich mit der Maus über eine QLabel
fahre. Es sieht so aus als ob QHoverEvent tun wird, was ich brauche, aber ich kann keine Tutorials oder Beispiele finden wie man das umsetzt. Ist es genauso gemacht wie Signale und Slots ?. Ich habe es versucht:
.. aber die Funktion wurde nicht aufgerufen, wenn ich über das Label schwebte.
Hier ist die Funktion, die in der Header-Datei als öffentlicher Slot aufgelistet ist:
%Vor%Kann mir jemand helfen, dies herauszufinden oder auf ein gutes Beispiel zu zeigen?
BEARBEITEN:
Nachdem ich einen Beitrag unten gelesen hatte, fand ich kein setFlag()
-Member für mein Label-Widget, aber ich habe es versucht:
Und entsprechend TestFunc()
aktualisiert. Aber immer noch passiert nichts, wenn ich mit der Maus rüber renne.
Nachdem ich mich angesehen habe, bin ich mir nicht sicher, ob QLabel
sogar mouseMoveEvent () sogar von QWidget
erbt. Wenn dies der Fall ist, gibt es ein Widget oder eine Liste von Objekten, die es irgendwo erben? Aus der Dokumentation auf ihrer Site kann ich nur ersehen, wie viele vererbte Funktionen ein Objekt hat.
Die Verwendung von Signalen und Slots für diesen Zweck wird nicht funktionieren.
mouseMoveEvent()
ist keine Signal- oder Meta-Methode und kann nicht mit einem Slot verbunden werden.
Das Unterklassifizieren der Widget-Klasse und das Überschreiben von mouseMoveEvent()
ermöglicht es Ihnen, Mausbewegungsereignisse zu erhalten, aber das ist eine sehr schwere Methode, dies zu erreichen (und fügt Ihrer Quellbasis eine weitere Klasse hinzu).
Ziehen Sie stattdessen in Erwägung, eine eventFilter()
-Methode für Ihre MyDialog
-Klasse zu implementieren und sie auf der QLabel
zu installieren. Mit dieser Ereignisfiltermethode können Sie alle Ereignisse für eine bestimmte QObject
-Instanz abfangen.
Hier finden Sie die Dokumentation zu Ereignisfiltern.
Außerdem würde ich Ihnen empfehlen, sich anhand des Codebeispiels einen Moment Zeit zu nehmen, um zu untersuchen, was die Makros SIGNAL()
und SLOT()
tun. Sie können sehen, wie sie in $QTDIR/src/corelib/kernel/qobjectdefs.h
Laut dem Dokumentlink, den Sie angeben, erhalten Sie dieses QHoverEvent nur, wenn Ihr Widget das Qt::WA_Hover
-Flag aufweist.
Nach dem Erstellen des Widget-Aufrufs:
%Vor%und sehen, ob es funktioniert.
Eine andere Möglichkeit, dasselbe Ergebnis zu erzielen, ist das Überschreiben von mouseMoveEvent()
in Ihrem Widget
Beachten Sie, dass diese Funktion auch normalerweise nicht aufgerufen wird, wenn Sie nicht Folgendes aufrufen:
Dies ist im Grunde, wie QT das Hover-Ereignis intern implementiert.
Erzwingt, dass Qt Zeichenereignisse generiert, wenn die Maus in den Modus ein / ausgeht Widget. Diese Funktion wird normalerweise beim Implementieren von benutzerdefiniert verwendet Stile; Details finden Sie im Styles-Beispiel.
Diese
QStyle::polish()
Überladung wird einmal bei jedem gezeichneten Widget aufgerufen den Stil verwenden. Wir implementieren es neu, um das AttributQt::WA_Hover
zu setzen aufQPushButtons
undQComboBoxes
. Wenn dieses Attribut gesetzt ist, Qt generiert Paint-Ereignisse, wenn der Mauszeiger in den oder aus dem Mauszeiger gelangt Widget. Dies ermöglicht das Rendern von Drucktasten und Comboboxen anders, wenn der Mauszeiger über ihnen ist.
QWidget
Setze das Widget-Attribut für WA_Hover
%Vor% Implementiere QWidget::enterEvent()
und QWidget::leaveEvent()
.
Fertig
UPDATE:
Halten Sie die Taste gedrückt, und sehen Sie, wie sich die Zählung ändert. Sehen Sie sich die Anwendungsausgabe für weitere Informationen an.
Ich hoffe, das hilft.
QHoverEvent
ist nur für Hover-Widgets, Sie möchten die Handler enterEvent
und leaveEvent
implementieren, indem Sie stattdessen das Widget erstellen.
Wenn Sie stattdessen einen Ereignisfilter verwenden möchten, sind die entsprechenden Ereignistypen QEvent::Enter
und QEvent::Leave
.
Wenn Sie lediglich das Erscheinungsbild des Widgets ändern müssen, sollten Sie sich Qt-Stylesheets ansehen, da diese einen :hover
-Wähler bereitstellen.
Ich hatte das gleiche Problem, ich kam zu dem folgenden Lösungsentwurf:
In meinem Haupt-Widget möchte ich Hover-Ereignisse einiger ausgewählter Objekte verarbeiten. Aus diesem Grund habe ich 2 Slots auf meinem MainWindow
erstellt:
Dann habe ich eine Event Filter Klasse wie folgt erstellt:
hoverventfilter.h
%Vor%hovereventfilter.cpp
%Vor% Sie können sehen, dass diese Klasse je nach dem, was passiert ist, entweder HoverIn oder HoverOut auslöst. Dieser Ansatz benötigt keine Einstellungen von Qt::WA_Hover
Als letzten Schritt müssen wir nun angeben, welche Elemente gefiltert werden sollen und Signale und Slots verbinden. Ich werde einen privaten Zeiger auf Ereignisfilter in mainwindow.h
erstellen %Vor%Und im Konstruktor füge ich Folgendes hinzu:
%Vor%Nun, wann immer ich Hover-Events für ein Objekt erhalten möchte, setze ich einfach einen Event-Filter, wie folgt:
%Vor% Was übrig bleibt, ist die Implementierung von onHoverIn
und onHoverOut
in MainWindow
. Sie haben beide die gleiche Idee, also zeige ich nur onHoverIn
Sie können das so einfach erweitern, um Hover-Events für neue Objekte zu bearbeiten, Sie legen einfach einen Event-Listener darauf und kümmern sich darum, was Sie in den Methoden onHoverIn
und onHoverOut
machen möchten. Keine Unterklasse von Widgets erforderlich.
Sie müssen focusInEvent und focusOutEvent des jeweiligen Widgets.