我知道,这基本上是the same question,但我的问题更进一步。
以下树解释了我的结构:
QWidget
|
CustomWidget
| |
MyTable MyWidgetAroundIt
我在Qt Designer中提升了MyTable
。所以,我可以将它添加到MyWidgetAroundIt
。这很有效。唯一的问题是,CustomWidget
要求它的父级也是CustomWidget
,其构造函数如下:
CustomWidget(CustomWidget* parent) : QWidget(parent), _specialValue(parent->getSpecialValue)
这会导致编译错误,因为设计器生成的代码尝试使用MyTable
而不是QWidget*
初始化CustomWidget*
。我可以/应该做些什么来防止这种情况和/或给设计师一个关于这个要求的暗示?
答案 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) {}
};