Qt Focus Chain



  • Hallo,

    in der Doku habe ich diese beiden Methoden gefunden um mich durch die Tab-Reihenfolge zu "hangeln":

    QWidget* QWidget::previousInFocusChain() const
    QWidget* QWidget::nextInFocusChain() const

    Außerdem gibt es auch noch:

    void QWidget::setTabOrder(QWidget *first, QWidget *second)

    Leider vermisse ich eine Methode, die mir das erste Widget in der Tab-Reihenfolge liefert. Bei Google wurde ich leider auch nicht fündig und hoffe hier kann mir jemand weiterhelfen?

    Gruß, Sascha



  • kannst du nicht einfach hiermit http://doc.qt.io/qt-4.8/qtabwidget.html#setTabEnabled und dem index 0 den tab setzen?



  • Bennisen schrieb:

    kannst du nicht einfach hiermit http://doc.qt.io/qt-4.8/qtabwidget.html#setTabEnabled und dem index 0 den tab setzen?

    Du hast leider mein Problem falsch verstanden, es geht nicht um ein Tab-Widget. Ich will in einem ganz gewöhnlichen Widget das erste Steuerelement in der Tabulatorreihenfolge ermitteln (das bei Anzeige normalerweise automatisch den Focus erhält).

    Ich habe den Sonderfall das mein Widget zur Laufzeit in einen Container eines anderen Widgets eingefügt wird, deshalb wird der Focus nicht automatisch gesetzt.



  • Hab es selbst herausgefunden, QWidget::nextInFocusChain() ist die Lösung. Ich hatte das so verstanden, das die Methode sich auf den aktuellen Focus bezieht und mir das folgende Steuerelement liefert.

    Tatsächlich liefert es aber immer das nächste Steuerelement auf das die Methode aufgerufen wird, also beim Aufruf auf das Widget selbst gibt es mein gesuchtes Steuerelement zurück. Ich muss das nur noch testen:

    void QxForm::focusFirstUiField(QWidget *uiField)
    {
        if (uiField == 0)
            uiField = this;
    
        if (QxUiField::isUiField(uiField) && !QxUiField::isReadOnly(uiField)) {
            uiField->setFocus();
            return;
        }
    
        uiField = uiField->nextInFocusChain();
        if (uiField && focusWidget() != uiField)
            focusFirstUiField(uiField);
    }
    

    Anmerkung: QxUiField::isUiField() prüft ob es sich um ein beliebiges Eingabefeld handelt, das kann ein LineEdit, eine SpinBox, etc. sein.


Anmelden zum Antworten