Wie implementiere ich QHoverEvent in Qt?

7

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:

%Vor%

.. 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:

%Vor%

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.

    
Alpants 04.01.2009, 22:40
quelle

6 Antworten

6

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

definiert sind     
Michael Bishop 05.01.2009, 23:14
quelle
9

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:

%Vor%

Dies ist im Grunde, wie QT das Hover-Ereignis intern implementiert.

    
shoosh 04.01.2009 22:54
quelle
7

Ссылка

Ссылка

Ссылка

Qt :: WA_Hover

  

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 Attribut Qt::WA_Hover zu setzen   auf QPushButtons und QComboBoxes . 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.

So erhalten Sie die Ereignisse "Enter" und "Leave" für QWidget

  1. Setze das Widget-Attribut für WA_Hover

    %Vor%
  2. Implementiere QWidget::enterEvent() und QWidget::leaveEvent() .

    %Vor%
  3. Fertig

QHoverEvent in QWidget

Ссылка

Ссылка

Ссылка

%Vor%

UPDATE:

Einfaches Beispiel

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.

    
phyatt 15.10.2014 21:00
quelle
1

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.

    
Sebastian Wahl 30.07.2013 14:25
quelle
1

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:

%Vor%

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

%Vor%

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.

    
Tomáš Navara 26.10.2016 20:47
quelle
-3

Sie müssen focusInEvent und focusOutEvent des jeweiligen Widgets.

    
Ariya Hidayat 07.03.2009 23:22
quelle

Tags und Links