2017-01-26 10 views
1

これは基本的にはthe same questionですが、私の問題はさらに深刻です。QT Creatorでカスタムコンストラクタを使用してカスタムウィジェットを宣伝する

次のツリーは私の構造を説明します

  QWidget 
      | 
     CustomWidget 
     |  | 
    MyTable MyWidgetAroundIt 

私はQtのデザイナーでMyTableを推進してきました。だから、MyWidgetAroundItに追加することができます。それはかなりうまくいった。唯一の問題は、CustomWidgetが、それはあまりにもCustomWidgetなるように親の必要があり、そのコンストラクタがどのように見えるされています。設計者は、コードではなくCustomWidget*の、QWidget*MyTableを初期化しようとすると生成されたとして

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

これは、コンパイルエラーが発生します。これを防ぐために、あるいはデザイナーにこの要件についてのヒントを与えるために、私は何ができますか?

答えて

3

親がQWidgetにできないウィジェットは、ウィジェットではありません。あなたのデザインはLiskov Substitution Principleを破り、修正する必要があります。

特別な機能を有効にするには、ウィジェットが特定のタイプになっても、ウィジェットがウィジェットを親として使用できるようにする必要があります。したがって

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

か:

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

私はあなたの最初のソリューションが移動するための方法である考え出しました。とにかく、私はデザイン全体を考え直しました。私の特別な価値は、私がしなければならないもののオプションのショートキーのようです。可能なリファクタリングを調べて、すべてを標準QWidget *の親に戻します。とにかく説明していただきありがとうございます!かなり明確な点を作った! – Migsi

+0

これは非常に良い議論のようです。しかし、同じロジックに従えば、 'QWidget'は' QWidget'の親だけを許して(QObject'ではなく)liskovの原則を破るとは言えませんか? – Mike

+1

これはAPIのバグです。これを修正するためにはQtのアーキテクチャに最小限の変更が必要ですが、現時点ではサポートされていません([試してみるとクラッシュする](http://stackoverflow.com/q/28992276/1329652))。それは修正するのが大したことではないでしょう、私はそれを例にするとは思いません。 –

関連する問題