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



我知道,这基本上是同一个问题,但我的问题更进一步。

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

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

相关内容

  • 没有找到相关文章

最新更新