Seite 1 von 1

[gelöst]Cursor in TabWidget-Reiter + Edit. des Reiter-Text

Verfasst: 26. Juni 2007 12:40
von sirBetz
Hallo alle Miteinander,

Ich möchte, dass der Benutzer per doppelclick auf eines der Tab in
der QTabBar den Text editieren kann. Dazu soll einfach ein
Cursor in dem Tab (im Reiter direkt) erscheinen.
Mit Enter soll, der geänderte Reiter-Text dann übernommen werden.

Mein grundsätzlicher Ansatz war, ein QLineEdit irgendwie
direkt im Reiter zu platzieren. Jedoch fehlt mir ein Ansatz.

Hat jemand eine Idee, wie man ein editierbaren Reiter-Text umsetzen könnte?

Gruß

Flo

Verfasst: 26. Juni 2007 17:26
von upsala
Fang einen Mausklick auf einen der Reiter ab und präsentiere einen QInputDialog. Ist einfacher...

Von hinten durch die Brust ins Auge ;-)

Verfasst: 30. Juni 2007 16:23
von sirBetz
Vielen Dank für die Antwort.
Mittels eines Dialogs hatte ich bereits eine Lösung implementiert, aber der
Ehrgeiz hat mich dann gepackt das wie oben beschrieben zu realisieren.
Ich hab den Code gerade nicht vor mir, daher schreib ich nur ganz kurz wie das prinzipiell gemacht habe für alle die es interessiert.

Zunächst muss man von QTabWidget ableiten, um an die QTabBar zu gelangen, die die einzelnen Reiter enthält. Ich hab mich zusätzlich noch ein kontextmenü zu implementieren das erscheint wenn man auf eines der Tabs klickt. Daher habe ich ebenfalls von QTabBar abgeleitet und die virtuelle Methode contextMenuEvent überschrieben. Nun hab ich in der von QTabBar abgeleiteten Klasse ein Member vom Typ QLineEdit eingefügt, das für das umbennenen auf den Reitertext gelegt wird. Dieses QLineEdit bekommt als Parent-Element (setParent()) das QTabBar zugewiesen. Damit wird es direkt auf das QTabBar gezeichnet. STandartmäßig auf 0,0.
Im Konstruktor des QTabBar habe ich dann den Rahmen ausgeblendet, die Hintergrundfarbe des auf die der Tabs gesetzt (QPalette) und das ganze QLineEdit unsichtbar gemacht.
Soll der Tab nun Editiert werden muss das QLineEdit sichtbar gemacht werden und über den Tab gelegt werden. Den Bereich den ein Tab einnimmt kann man ganz komfortabel über die Funktion tabRect der Klasse QTabBar ermitteln.
Nun noch den Cursor in das QLineEdit reinsetzen und auf das Signal textEditingFinished() des QLineEdit warten. Umbenennen. Fertig.

Naja, leider noch nicht ganz. Denn wenn mehr Tab vorhanden sind als in die QTabBar passen erscheinen Buttons zum scrollen. Scrollt man während das QLineEdit sichtbar ist, kann es passieren das es über diese Buttons gezeichnet wird. Den Klick auf die Scollbuttons kann man weder im QTabBar noch im QTabWidget abfangen. Und die Scroll-Buttons können auch leider nicht direkt geholt werden. Dazu muss man ein bisschen tricksen und über die Child-Elemente des QTabBar gehen.
Alle Elemente auslesen und per dynamic_cast prüfen ob es sich um den Typ QToollButton* handelt. Wenn das der Fall ist ein Slot einrichten der auf das Klick-Signal des Scroll-Buttons reagiert und dort die Editierung abbrechen indem das QLineEdit wieder unsichtbar gemacht wird.

Genug geschrieben. Machen wahrscheinlich die wenigsten so aufwändig
aber ist doch gut zu wissen was mach da alles machen kann.

Allen ein schönen Tag

Gruß

SirBetz

Verfasst: 30. Juni 2007 20:13
von upsala
Es ist schön zu sehen, daß es hier auch Leute gibt, die ohne Hilfe auch etwas komplexere Dinge umsetzen können, ohne daß man Ihnen die gesamte Doku vorkauen muß. :o