2017-12-29 62 views
1

Ich versuche eine Funktion zu erstellen, die einen (qt) Type als Parameter verwendet und damit Kinder findet. Meine Funktion sieht wie folgt aus:Qt Typ als Parameter der Funktion

template <typename QType> 
void MyClass::activateElements(QWidget *widget, QType t) 
{ 
    QList<QType *> buttons = widget->findChildren(t); 
    foreach(QType *button, buttons) 
    { 
     buttons->setEnabled(true); 
    } 
} 

ich auch

template <typename QType> 
void MyClass::activateElements(QWidget *widget, QType) 
{ 
    QList<QType *> buttons = (* widget).findChildren<QType *>(); 
    foreach(QType *button, buttons) 
    { 
     button->setEnabled(true); 
    } 
} 

versucht haben, instanziieren ich ein Objekt der Klasse, die diese Funktion in einer anderen Klasse verwendet. Es versuche ich, es so zu verwenden:

QDoubleSpinBox x; 
    object_of_my_class->activateElements(correctWidget, x); 

An diesem Punkt, den ich nicht weiterkommen, weil ich die folgende Fehlermeldung erhalten:

error: ‘QDoubleSpinBox::QDoubleSpinBox(const QDoubleSpinBox&)’ is private Q_DISABLE_COPY(QDoubleSpinBox)

Wie würde ich dieses Problem umgehen, dass QDoubleSpinBox und andere sind Privatgelände? Habe ich angesprochen, wie man die Funktion falsch baut oder verwende ich sie nur falsch? Gibt es überhaupt einen Weg dies zu tun?

+0

„_How würde ich umgehen dieses Problem, dass QDoubleSpinBox und andere sind privat? _ "Der Fehler besagt, dass ** copy-constructor ** von' QDoubleSpinBox' privat ist (dh es kann nicht kopiert werden). Pass auf Referenz statt auf Wert. –

Antwort

2

Es sieht so aus, als ob Sie überhaupt kein Objekt dieses Typs benötigen, nur den Typ selbst. In einem solchen Fall würde das Template-Argument spezifiziert sein der Weg zu gehen:

template <typename QType> 
void MyClass::activateElements(QWidget *widget) 
{ 
    QList<QType *> buttons = (* widget).findChildren<QType *>(); 
    foreach(QType *button, buttons) 
    { 
     button->setEnabled(true); 
    } 
} 

// Usage: 
object_of_my_class->activateElements<QDoubleSpinBox>(correctWidget); 

Dies ist, wie ich es tun würde, da es ziemlich gut Absicht zum Ausdruck bringt.

Wenn Sie jedoch wirklich wollen Typen Abzug von einem vorhandenen Objekt zu ermöglichen, es als Verweis übergeben, die (verbotene) kopieren zu vermeiden:

template <typename QType> 
void MyClass::activateElements(QWidget *widget, const QType &) 
{ 
    QList<QType *> buttons = (* widget).findChildren<QType *>(); 
    foreach(QType *button, buttons) 
    { 
     button->setEnabled(true); 
    } 
} 

// Usage: 
QDoubleSpinBox x; 
object_of_my_class->activateElements(correctWidget, x); 
+0

Vielen Dank schon! Der erste Ansatz scheint tatsächlich die bessere Option zu sein. Ich war früher dort, aber ich muss den Funktionsaufruf durcheinander gebracht haben und bin dann verloren gegangen. Mit diesem wieder bekomme ich "undefinierten Verweis auf' void MyClass :: activateElements (QWidget *) '. Ich habe es definiert als 'Vorlage void activateElements (QWidget * Widget);' in der Kopfzeile Datei Ist das mein Fehler? – Shin

+0

@Shin Haben Sie * definiert * es dort (einschließlich der Körper), oder nur * deklariert * es dort (und legte seine Implementierung in eine '.cpp' Datei)? Nur die ehemalige kann funktionieren: siehe [Warum können Vorlagen nur in der Header-Datei implementiert werden?] (https://stackoverflow.com/q/495021/1782465). – Angew

+0

Ich wusste nicht, dass diese Funktion auch in der Header-Datei definiert werden muss. Habe das und es funktioniert endlich alles. Vielen Dank für deine Hilfe :) – Shin