在 QT Creator 中使用自定义构造函数提升自定义小部件

Promote custom widget with custom constructor in QT Creator

我知道,这基本上是 the same question,但我的问题更进一步。

下面的树解释了我的结构:

         QWidget
            |
       CustomWidget
        |        |
    MyTable  MyWidgetAroundIt

我在 Qt Designer 中提升了 MyTable。所以,我可以将它添加到 MyWidgetAroundIt。效果很好。唯一的问题是,CustomWidget 要求它的父级也是 CustomWidget,它的构造函数看起来像:

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

这会导致编译错误,因为设计器生成的代码会尝试使用 QWidget* 而不是 CustomWidget* 来初始化 MyTable。 could/should 我做了什么来防止这种情况 and/or 给设计师一个关于这个要求的提示?

父级不能是 QWidget 的小部件不再是小部件。您的设计违反了 Liskov 替换原则,必须修复。

如果小部件恰好属于某种类型,您可以自由启用特殊功能,但小部件必须可与父级的任何小部件一起使用。

因此:

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) {}
};