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
-
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 Templatesondern
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.