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

时间:2017-01-26 11:40:21

标签: qt qwidget qt-designer

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

以下树解释了我的结构:

         QWidget
            |
       CustomWidget
        |        |
    MyTable  MyWidgetAroundIt

我在Qt Designer中提升了MyTable。所以,我可以将它添加到MyWidgetAroundIt。这很有效。唯一的问题是,CustomWidget要求它的父级也是CustomWidget,其构造函数如下:

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

这会导致编译错误,因为设计器生成的代码尝试使用MyTable而不是QWidget*初始化CustomWidget*。我可以/应该做些什么来防止这种情况和/或给设计师一个关于这个要求的暗示?

1 个答案:

答案 0 :(得分:3)

父级不能是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) {}
};