我知道,这基本上是同一个问题,但我的问题更进一步。
下面的树解释了我的结构:
QWidget
|
CustomWidget
| |
MyTable MyWidgetAroundIt
我在Qt Designer中推广了MyTable
。因此,我可以将其添加到MyWidgetAroundIt
。效果很好。唯一的问题是,CustomWidget
也要求它的父级是CustomWidget
,它的构造函数看起来像:
CustomWidget(CustomWidget* parent) : QWidget(parent), _specialValue(parent->getSpecialValue)
这会导致编译错误,因为设计器生成的代码试图用QWidget*
而不是CustomWidget*
初始化MyTable
。我可以/应该做些什么来防止这种情况发生和/或向设计师提供有关此要求的提示?
父级不能是QWidget
的小部件不再是小部件。你的设计违反了利斯科夫替代原则,必须加以修正。
如果小部件恰好是特定类型的,您可以自由启用特殊功能,但小部件必须可用于父级的任何小部件。
因此:
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) {}
};