经过一番探索,我找到了解决问题的“部分”解决方案。
如果您正在创建布局并使用它管理小部件,则可以稍后在代码中使用 Qt 的动态属性检索此布局。现在,要使用 QWidget::setProperty(),您要存储的对象需要是已注册的元类型。指向 QHBoxLayout 的指针不是已注册的元类型,但有两种解决方法。最简单的解决方法是通过在代码中的任何位置添加此对象来注册对象:
Q_DECLARE_METATYPE(QHBoxLayout*)
第二种解决方法是包装对象:
struct Layout {
QHBoxLayout* layout;
};
Q_DECLARE_METATYPE(Layout)
一旦对象是一个注册的元类型,你可以这样保存它:
QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
widget->setProperty("managingLayout", QVariant::fromValue(layout));
layout->addWidget(widget);
如果您使用第二种解决方法,或者这样:
QHBoxLayout* layout = new QHBoxLayout;
QWidget* widget = new QWidget;
Layout l;
l.layout = layout;
widget->setProperty("managingLayout", QVariant::fromValue(l));
layout->addWidget(widget);
稍后当您需要检索布局时,您可以通过以下方式检索它:
QHBoxLayout* layout = widget->property("managingLayout").value<QHBoxLayout*>();
或者像这样:
Layout l = widget->property("managingLayout").value<Layout>();
QHBoxLayout* layout = l.layout;
此方法仅在您创建布局时适用。如果您没有创建布局并设置它,那么以后就没有简单的方法来检索它。此外,您还必须跟踪布局并在必要时更新managementLayout 属性。