Tabwechsel ändern ....

Alles rund um die Programmierung mit Qt
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Tabwechsel ändern ....

Beitrag von QtNoob2008 »

Nabend,

habe mal wieder nen kleines Problem. Ich verwende ein ganz normales QTabWidget in meiner Anwendung und möchte nun dass die Tabs nicht sofort durch ein "pressed()"-Signal gewechselt werden, sondern eher wie es bei einem einfachen QPushButton der Fall ist durch z.B. ein "clicked()"-Signal. Wie kann ich dies am leichtesten umsetzen und mein QTabWidget anpassen? Bin euch für jeden Tipp dankbar!

Gruß QtNoob2008
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

Du koenntest eine Klasse schreiben, die von QTabWidget ableitet. Einfacher waere wohl aber, dass du einen EventFilter nutzen. Wenn du den in einer deiner Klassen implementierst, kannst du ihn per

Code: Alles auswählen

tabWidget->installEventListener ( this );
nutzen und alle events abfangen
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Warum will man das? Was soll das für einen Nutzen haben?
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

Guten Morgen,

vielen Dank, nach dem

Code: Alles auswählen

installEventListener()
werde ich mir gleich mal gucken!

@upsala:
... weil z.B. meine Buttons auf ein "clicked()" ihre Aktionen ausführen und wenn ich den Button drücke und im gedrückten Zustand (also pressed() )den Button verlasse, das clicked Signal nicht gesendet wird und keine Aktion erfolgt. Dieses Verhalten möchte ich auch bei den Tabs haben, sprich bei einem "drag out" soll das Tab nicht gewechselt werden, erst wenn der Benutzer wieder die Maustaste über dem gleichen "Reiter" losläßt, soll der Wechsel erfolgen.
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

... ähm den

Code: Alles auswählen

installEventListener()
gibt es wohl nicht.
du meinst wohl den

Code: Alles auswählen

installEventFilter()
???
Sowas hab ich schon einmal für Buttons ausprobiert...

Frage mich aber ob ich den Filter dann aber dann dem TabWidget oder der TabBar übergeben muss. Zudem habe ich keine Ahnung was ich da dann genau überschreiben soll... :(
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Ja er meint installEventFilter. Und wieso weißt du nicht wie du den dann ins TabWidget installiest? Die Funktion ist in QObject deklariert und QTabWidget leitet von QObject ab.
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

...den Filter installieren ist ja nicht das Problem. Hab ich schon einmal für 2 Buttons testweise erstellt. Mein Problem ist, ich weiß nicht was ich in dem Filter überschreiben muss um mein Verhalten hinzubekommen...
Muss ich das

Code: Alles auswählen

QEvent::MouseButtonPress 
überschreiben ??? Bin mir da nicht sicher, weil das QTabWidget ja noch den "Anzeigebereich" enthält ... :roll:
myme
Beiträge: 24
Registriert: 31. März 2008 14:25

Beitrag von myme »

Mein erster Gedanke wäre, ein Event Filter auf die QTabBar des QTabWidgets zu setzen, um die MousePress Events unter die Lupe zu nehmen. Das MouseRelease Event müsste weiter durchgehen, damit die QTabBar ein "currentChanged" Signal an das QTabWidget sendet, wenn der Mausknopf losgelassen wird.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

1. Finde ich, daß dich um völlig falsche Probleme kümmerst.
2. Müßt dir der Event-Filter eigentlich schon bekannt sein
C167
Beiträge: 105
Registriert: 9. Februar 2008 20:30

Beitrag von C167 »

PeterLustig hat geschrieben:Ja er meint installEventFilter. Und wieso weißt du nicht wie du den dann ins TabWidget installiest? Die Funktion ist in QObject deklariert und QTabWidget leitet von QObject ab.
Exakt, das passiert, wenn nebendran einer steht und einem was vom Java'ischen ActionListener erzaehlt... sorry dafuer.

Ich wuerde dir empfehlen, einfach mal per qDebug() die einzelnen Events auszugeben, wenn sie kommen. Dadurch kannst du herausfinden, welches Event von welcher Aktion ausgeloesst wird.
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

kein Problem :lol: !!!

Also habe gerade schon ein wenig ausprobiert. Der erstellte Eventfilter für die Buttons funktioniert auch für das TabWidget, da aber nur für den Anzeigebereich. Hab danach den Eventfilter einer einfachen TabBar zugewiesen und 2 Tabs mit

Code: Alles auswählen

tabbar->addTab("Text1");
tabbar->addTab("Text2");
hinzugefügt.
Der Filter funktioniert anscheinend auch, aber leider für den gesamten Anzeigebereich der TabBar, nicht seperat für die einzelnen "Reiter"... :(
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Da musst du auch selbst überprüfen ob an der gegebenen Position ein Tab ist. Tabbar bietet dafür Funktionen.
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

@myme:

ja genau das habe ich ausprobiert. Der Filter funktioniert dort wie bei den Buttons oder beim TabWidget!

@upsala:
1. Finde ich, daß dich um völlig falsche Probleme kümmerst.
2. Müßt dir der Event-Filter eigentlich schon bekannt sein
Wieso falsche Probleme, was meinst du genau? Der Event-Filter ist mir bekannt...

@Peter ich glaub das nützt nicht viel, weil der Filter ja auf die einzelnen Reiter wirken soll..... So hat die TabBar den Filter und verwendet ihn.
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Und es gibt keine "einzelnen Buttons". Es gibt nur die Tabbar, und auf diesen wirkst du den Filter. Dort überprüfst du ob die Maus über einem der Buttons geklickt wurde (Tabbar bietet eine Funktion dafür) und handelst je nach dem.
QtNoob2008
Beiträge: 54
Registriert: 10. April 2008 08:27

Beitrag von QtNoob2008 »

ahh ok, stimmt ! Danke !!!
D.h. im Endeffekt muss meinen Eventfilter anpassen und dort die Koordinatenauswertung für die einzelnen Tabs durchführen.

Im Moment macht mein Eventfilter eine Auswertung ob in den Koordinaten des Widgets geklickt wurde "MouseButtonPress" und ob beim "MouseButtonRelease" der Cursor noch Widget Bereich ist.
Antworten