Tab-Index für Cus­tom Wid­gets in QtDesigner

Im QtDe­si­gner kann man den Tab-Index der Wid­gets, also die Rei­hen­fol­ge, in der sie beim Drü­cken der Tab-Tas­te den Fokus erhal­ten, ganz ein­fach bear­bei­ten. Dazu wählt man im Menü „Bearbeiten” den Punkt „Tabulatorreihenfolge bearbeiten” aus und klickt dann in der gewünsch­ten Rei­hen­fol­ge auf die Wid­gets. (zurück zur Wid­get-Bear­bei­tung geht’s dann mit F3 oder „Bear­bei­ten” -> „Wid­gets bearbeiten”)

Das funk­tio­niert aber nicht mehr, wenn Cus­tom Wid­gets in Spiel kom­men. Da der Inhalt der Cus­tom Wid­gets zur Zeit der Bear­bei­tung im QtDe­si­gner noch nicht exis­tiert, kann ihnen auch kein Tab-Index zuge­wie­sen wer­den. Zur Lauf­zeit wer­den die inter­nen Wid­gets des Cus­tom-Wid­gets dann in der Rei­hen­fol­ge ihrer Erzeu­gung hin­ten an den Tab-Index ange­hängt, was zum unschö­nen Sprin­gen des Fokus führt.

Abhil­fe schafft ein „Focus Pro­xy” im Cus­tom Wid­get in Zusam­men­hang mit der „Focus Poli­cy” des Platzhalters.

Bei der Erzeu­gung des Cus­tom-Wid­gets muss mit „set­Fo­cus­Pro­xy” ein Wid­get inner­halb des Cus­tom-Wid­gets als Stell­ver­tre­ter für das Erhal­ten des Fokus benannt wer­den. Wenn zum Bei­spiel im Cus­tom-Wid­get „myCus­tom­Wid­get” das ent­hal­te­ne Wid­get „myFirst­In­ter­nal­Wid­get” den Fokus zuerst erhal­ten soll, sähe das so aus:

class myCustomWidget(QWidget):
    ...
    myFirstInternalWidget = QLineEdit()
    self.layout().addWidget(myFirstInternalWidget)
    ...
    self.setFocusProxy(myFirstInternalWidget)
    ...

Um das Ver­hal­ten des Fokus inner­halb des Cus­tom-Wid­gets muss man sich übri­gens mit setTabOrder() selbst küm­mern, falls man vom Stan­dard­ver­hal­ten (nach Rei­hen­fol­ge der Erzeu­gung) abwei­chen will.

Zusätz­lich muss für das Platz­hal­ter-Wid­get im QtDe­si­gner noch die Focus Poli­cy auf „TabFocus” (Fokus nur durch Tab-Tas­te) oder bes­ser „StrongFo­cus” gesetzt wer­den (dann kann es den Fokus zusätz­lich auch durch Maus-Klick erhalten).

Danach ver­hält sich das Cus­tom-Wid­get so, dass der Focus­Pro­xy des Cus­tom-Wid­gets dann den Fokus erhält, wenn der Platz­hal­ter des QtDe­si­gners an der Rei­he ist. Die inter­nen Wid­gets fol­gen dann in der im Cus­tom Wid­get defi­nier­ten Fol­ge, bevor das nächs­te Wid­get nach QtDe­si­gner-Rei­hen­fol­ge fokus­siert wird.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

elf − neun =