在 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) {}
};
我知道,这基本上是 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) {}
};