Problems with Open-Source Downloads read https://www.qt.io/blog/problem-with-open-source-downloads and https://forum.qt.io/post/638946
Hover over QPushButton
-
Guten Tag mal wieder,
also ich habe eine Grafik in meinem Programm, die sich durch betätigen 4 übereinanderliegenden Buttons in die Richtung von diesen ausrichtet. Jetzt ist nur das jeweilige klicken nicht so schön und ich hätte gerne, dass sich die Grafik auch ausrichtet wenn ich einen der Buttons klicke und dann über die anderen mit der Maus fahre. Ist das in irgendeiner Form möglich?
Vielen Dank für eure Hilfe!
-
-
Hi @Jakobm789 ,
sicher QPushButton hat wie alle von QWidget abgeleiteten Klassen die Evente enterEvent und leaveEvententerEvent() is called when the mouse enters the widget's screen space. (This excludes screen space owned by any of the widget's children.) leaveEvent() is called when the mouse leaves the widget's screen space. If the mouse enters a child widget it will not cause a leaveEvent().
auf die kann man reagieren und entsprechenden Code ausführen
Um an das event zu kommen kannst du entweder die function überschreiben oder nen eventFilter installieren
-
@J-Hilk Okay, aber wie übergebe ich der Funktion genau welches Widget er prüfen soll?
void QWidget::enterEvent(QEvent *event) { qDebug() <<"Moin"; event->accept(); }
-
-
@J-Hilk Vielen Dank, nach genau so einem Beispiel habe ich gesucht. Nur noch kurz: was macht das override?
-
@Jakobm789
https://en.cppreference.com/w/cpp/language/overrideEs zeigt, das du hier eine Funktion einer Grundklasse willentlich und bewusst überschreibst.
Es garantiert nen compile time error, when you versuchst eine nicht virtuelle Funktion zu überschreiben und die Warnung verschwindet, das du eine Funktion shadowst
-
@J-Hilk Danke!
-
@Jakobm789 Irgendwie scheine ich das nicht zu raffen:
void testcpp::enterEvent(QEvent *e) { myButton::enterEvent(e); qDebug() <<"Moin"; }
Funktioniert so nicht...
-
@Jakobm789 said in Hover over QPushButton:
myButton::enterEvent(e);
QPushButton::enterEvent(e);
if base class of your class is QPushButton.
This means you are calling the enterEvent from the base class of your class.
-
@jsulm yeah, but if i do this, i have to remove the base public Qwidget and then some of my other functions dont work any longer. Or am I wrong or made a mistake?
-
@Jakobm789 Then change it to
QWidget::enterEvent(e);
-
@jsulm Yes that works, thanks. But italways prints out when im hovering the Main Widget, how can I change this to a button or another sub widget?
-
@Jakobm789 Derived from QPushButton and implement it there and then use this instead of QPushButton.
-
@jsulm Do you maybe have an Example? I dont get it.
-
@Jakobm789 Ist der Link von @J-Hilk nicht so ein Beispiel?
-
@jsulm Irgendwo schon, aber da wird ja einfach ein großer Button als Hintergrund quasi genutzt, ich habe in meiner UI 4 Buttons die jeweils unterschiedliche Funktionen auslösen sollen. Ich steig nicht durch wie ich das auf meinen Fall anwenden soll, ich bekomme auch einfach einen großen Button als Hintergrund und es wird immer gezählt wenn ich über diesen hovere.
-
@Jakobm789 said in Hover over QPushButton:
ich habe in meiner UI 4 Buttons die jeweils unterschiedliche Funktionen auslösen sollen
Ich verstehe das Problem nicht: implementiere deinen eigenen Button (abgeleitet von QPushButton) und benutze diesen so oft wie du willst genau so wie du QPushButton benutzen würdest. Was genau ist das Problem?
-
@jsulm Ich habe nicht gerallt das ich quasi meinen eigenen Button erstellen soll. Danke! Ich versuche mich mal.
-
@Jakobm789 ok hier steige ich nochmal ein...
ein paar Fragen die zu klären sind:
- Hast du eine Klasse (.h & .cpp) in deinem Projekt, das ein abgeleiteter QPushButton ist?
- wie erstellst du diese 4 Buttons ? Über den Designer, über quell code?
- QuellCode von dir, wie es aussieht währe sehr, sehr hilfreich! Die Kristallkugel gibt nur bedingt viel Auskunft.
-
@J-Hilk Zu erstens: Ich versuche mich grade daran, hatte das Beispiel komplett missverstanden.
Zu zweitens: die 4 Buttons habe ich im GUI Designer erstellt.
Und zu drittens: Wenn ich es nicht hinbekomme gucke ich mal, dass ich meinen Code hier reinschicke.Danke für eure Hilfe!
-
@Jakobm789 So jetzt funktioniert das ausgeben über den qDebug genau wie es soll. Jetzt noch eine Frage dazu: bekomme ich irgendwie übergeben, dass genau der Button mit dem Namen unter der Maus ist?
Vielen Dank für eure Geduld ihr habt mir echt weitergeholfen!
-
@Jakobm789 ok, da du deine Buttons mittels Designer gemacht hast, musst du diese "Promoten" zu der neuen unterklasse.
hier ist die offizielle Anleitung, wie man sowas macht:
https://doc.qt.io/archives/qt-4.8/designer-using-custom-widgets.html#promoting-widgetsanscheinend ist diese Erklärung aus der Qt5 Doku rausgenommen worden 🤔 oder ich finde es zumindest nicht. Ist aber weiterhin so gültig!
-
@J-Hilk Also die Buttons kann man einfach in der UI Datei mit einem Texteditor ändern, oder was bedeutet Promoten auf Deutsch? (Sicherlich nicht bewerben?)
-
-
@Christian-Ehrlicher Okay soweit verstanden(hoffentlich), Danke! Jetzt nochmal zurück zu meiner Frage: Kann ich irgendwie in dem Hoverevent einen Returnwert unterbringen oder sonst irgendwie in der Hauptkasse abfragen ob gehovert ist? Sonst bring der Ganze Krims Krams ja nichts , oder?
-
@Jakobm789 said in Hover over QPushButton:
Kann ich irgendwie in dem Hoverevent einen Returnwert unterbringen oder sonst irgendwie in der Hauptkasse abfragen ob gehovert ist?
Du kannst doch einfach eine Membervariable im Event setzen:
void testcpp::enterEvent(QEvent *e) { QPushButton::enterEvent(e); entered = true; }
-
@jsulm Ich bin noch blutiger C++ Anfänger, so einfach ist das alles gar nicht...
Wie frage ich diese Membervariable denn dann im Hauptcode ab?
-
@Jakobm789 said in Hover over QPushButton:
Hauptcode
Was verstehst du darunter? In der selben Klasse? In einer anderen?
Ich empfehle wirklich mal ein Buch über C++ zu lesen.
-
der Qt Weg wäre über ein Signal im der CustomButton Klasse das du im "HauptCode" abfängst, habe das Beispiel mal entsprechend angepasst.
Aber die anderen haben recht. Qt ist eine "Erweiterung" ein framework für C++ Grundlegende Sachen solltest du in reinem C++ üben und verstehen.
C++ ist keine einfach Sprache zu lernen, aber sie hat eine Reihe von Vorteilen 😉, und Qt an sich legt nochmal eine Komplexitätschicht oben drauf.
Ich würde empfehlen die Beispiele die mit Qt kommen, die einfachen zumindest, dir anzuschauen und versuchen zu verstehen was gemacht wurde.
-
@J-Hilk Ja das werde ich in Zukunft wohl müssen. Vielen Dank jetzt klappt alles so wie ichs wollte!
-
@Jakobm789 Nur schmeißt er mir jetzt einen connect Error in der qobject.h aus.
C:\Qt\Qt5.12.9\5.12.9\mingw73_32\include\QtCore\qobject.h:262: Fehler: no matching function for call to 'QObject::connect(const Object*&, void (HoverButton::*&)(bool), const Object*&, void (Joystick::*&)(bool), Qt::ConnectionType)' return connect(sender, signal, sender, slot, Qt::DirectConnection); ^
Jemand nen Plan woran das liegen kann?
-
@Jakobm789 Zeige bitte deinen connect Aufruf...
-
QObject::connect(ui->Button, &MyButton::mouseEntered, &testcpp::receivingFunction);
-
@Jakobm789 Das kann nicht das connect sein, welches die Fehlermeldung verursacht hat.
Und dieses connect ist auch falsh, da der Empfänger fehlt.
Bitte https://doc.qt.io/qt-5/signalsandslots.html lesen!
-
@jsulm Ja Stimmt es hat ein this gefehlt, es war aber dieses connect, da durch diese Verbesserung krinr Fehler mehr ausgegeben werden. Danke!
QObject::connect(ui->AccelerationLevelButton, &HoverButton::mouseEntered, this, &Joystick::receivingFunction);