template Funktion Benutzen



  • Hallo zusammen,

    ich wollte eine Template Funktion schreiben, die mir der Focus ja nach State (Status der Anwendung) entwieder auf PushButton oder QLineEdit setzen.

    Die Funktion sieht so aus:

    template <typename T>
    	void setFocusEncoderTest(T a)
    {
           if(a  == ui.lineEditBenutzerName)
           {
               ui.lineEditbenutzerName->setFocus(Qt::OtherFocusReason);
           }
          if(a == ui.pushNameValidation)
           {
                ui.pushNameValidation->setFocus();
           }
            .........
    }
    

    Hier ist der Aufruf:

    setFocusEncoderTest (ui.lineEditBenutzerName)
    

    Das funktioniert aber nicht.
    Fehler :

    error C2446: '==': no conversion from 'QPushButton *' to 'QLineEdit *'
    

    Ich dachte template Funktion ist für so was gedacht oder lag ich falsch
    Danke


  • Mod

    Nein, so geht das nicht. Dafür sind Templates auch nicht gedacht. Sieht eher so aus, als suchtest du Funktionsüberladung.



  • Sowohl QLineEdit als auch QPushButton sind Erben von QWidget. Nimm als Parameter einfach ein QWidget* (beide setFocus-Funktionen kommen ebenfalls aus QWidget).
    Brauchst du die Unterscheidung überhaupt?

    (PS: ich habe leider keine über "Hello Word" hinausgehende Ahnung von Qt)



  • wob schrieb:

    Brauchst du die Unterscheidung überhaupt?

    Ja



  • SeppJ schrieb:

    Nein, so geht das nicht. Dafür sind Templates auch nicht gedacht. Sieht eher so aus, als suchtest du Funktionsüberladung.

    Ja
    Es eine Funktionsüberladung und eigentlich soll keine problem sein
    z.B:

    template <typename T>
    void sum(T a);
    

    a: kann int double .....oder?

    Was ist der Unterschied dann zwischen beide Schreibweise?
    Danke



  • wob schrieb:

    Sowohl QLineEdit als auch QPushButton sind Erben von QWidget. Nimm als Parameter einfach ein QWidget* (beide setFocus-Funktionen kommen ebenfalls aus QWidget).

    (PS: ich habe leider keine über "Hello Word" hinausgehende Ahnung von Qt)

    Ja das stimmt:

    wob schrieb:

    Sowohl QLineEdit als auch QPushButton sind Erben von QWidget

    also hier ist deinen Vorschlag umgesetzt:

    void setFocusEncoderTest(QWidget* a)
    {
           if(a  == ui.lineEditBenutzerName)
           {
               ui.lineEditbenutzerName->setFocus(Qt::OtherFocusReason);
           }
          if(a == ui.pushNameValidation)
           {
                ui.pushNameValidation->setFocus();
           }
            .........
    }
    

    hätte ich aber gerne mit template gelöst 😉

    na ja
    Danke erstmal



  • hätte ich aber gerne mit template gelöst

    geht aber hier nicht - weil du nicht:

    nach Typ und zur Kompilierzeit unterscheiden kannst
    => wäre Template

    sondern

    mittels Pointervergleich zur Laufzeit die Entscheidung treffen musst
    => if und Basis-Klassen-Pointer

    "hätte ich aber gerne mit template gelöst"
    kann man in diesem Fall auch mit "der Verbrenner-Motor soll aber mit Wasser laufen" übersetzen - die Technik passt nicht zu deiner Anforderung



  • Wenn du zur Compilezeit entscheiden kannst, dann passt doch SeppJs Vorschlag:

    void setFocusEncoderTest(QPushButton* a) {
        a->setFocus();
    }
    
    void setFocusEncoderTest(QLineEdit* a) {
        a->setFocus(Qt::OtherFocusReason);
    }
    

    D.h. bei allen PushButtons wird setFous, bei allen LineEdits wird setFocus(Qt::OtherFocusReason) aufgerufen.


Log in to reply