2017-01-26 5 views
1

Ich weiß, das ist im Grunde the same question, aber mein Problem geht weiter.Werben benutzerdefinierte Widget mit benutzerdefinierten Konstruktor in QT Creator

Der folgende Baum erklärt meine Struktur:

  QWidget 
      | 
     CustomWidget 
     |  | 
    MyTable MyWidgetAroundIt 

I MyTable in Qt Designer gefördert haben. Also kann ich es zu MyWidgetAroundIt hinzufügen. Das hat ganz gut funktioniert. Das einzige Problem ist, CustomWidget erfordert es Eltern ist auch ein CustomWidget zu sein, dessen Konstruktor wie folgt aussieht:

CustomWidget(CustomWidget* parent) : QWidget(parent), _specialValue(parent->getSpecialValue) 

Dieser Fehler führt kompilieren, wie der Designer generierten Code versucht MyTable mit einem QWidget* zu initialisieren, anstelle des CustomWidget*. Was kann/sollte ich tun, um dies zu verhindern und/oder dem Designer einen Hinweis auf diese Anforderung zu geben?

Antwort

3

Ein Widget, dessen Eltern kein QWidget sein kann, ist kein Widget mehr. Ihr Entwurf bricht das Liskov Substitutionsprinzip und muss korrigiert werden.

Sie können spezielle Funktionen aktivieren, wenn das Widget einem bestimmten Typ angehört, aber ein Widget muss mit jedem Widget eines übergeordneten Elements kompatibel sein.

So:

CustomWidget(QWidget* parent = nullptr) : 
    QWidget(parent) 
{ 
    auto customParent = qobject_cast<CustomWidget*>(parent); 
    if (customParent) 
    _specialValue = customParent->specialValue(); 
} 

oder:

class CustomWidget : public QWidget { 
    Q_OBJECT 
    CustomWidget *_customParent = qobject_cast<CustomWidget*>(parent()); 
    SpecialType _specialValue = _customParent ? _customParent->specialValue() : SpecialType(); 

    SpecialType specialValue() const { return _specialValue; } 
public: 
    CustomWidget(QWidget * parent = nullptr) : QWidget(parent) {} 
}; 
+0

dachte ich Ihre erste Lösung aus der der Weg zu gehen. Wie auch immer, ich überlegte das ganze Design und mein besonderer Wert scheint ein optionaler Shortkey für die Dinge zu sein, die ich machen muss. Ich werde mögliche Refactorings untersuchen, um alles wieder auf Standard QWidget * Eltern zu ändern. Danke für die Erklärung sowieso! Habe einen ganz klaren Punkt gemacht! – Migsi

+0

Das klingt nach einem sehr guten Argument. Aber können wir nach der gleichen Logik nicht sagen, dass 'QWidget' das Liskov-Prinzip bricht, indem nur' QWidget'-Eltern (und nicht irgendein 'QObject') erlaubt werden? – Mike

+1

Das ist ein API-Fehler. Es würde minimale Änderungen an der Architektur von Qt erfordern, um das zu beheben, aber im Moment wird es nicht unterstützt ([wenn du es versuchst, stürzt es ab]) (http://stackoverflow.com/q/28992276/1329652)). Es wäre keine große Sache zu beheben und ich denke nicht, dass es ein Beispiel ist, dem ich folgen kann. –