可以在布局之间共享 QLineEdit 吗?

Is it OK to share a QLineEdit between Layouts?

我正在调试一些在两个布局框之间使用相同 QLineEdit 的代码。这是合法的吗? 看起来第二个布局框正在抓取控件,但它们不会在第一个布局中呈现。

但我找不到任何 documentation 来说明这是否是一个有效的用例,并且(也许)还有其他问题。

伪代码:

QLineEdit *valueEdit = new QLineEdit();

[...]

QGridLayout *layout1 =  new QGridLayout();
QGridLayout *layout2 =  new QGridLayout();

[...]

layout1->addWidget( valueEdit, 0, 0, Qt::AlignLeft );
layout2->addWidget( valueEdit, 0, 0, Qt::AlignLeft );  // same edit, 2x layouts, possible?

我怀疑代码试图重新使用编辑字段,因此它只需要从一组小部件中读取更新值。 (但我只是猜测。)在执行期间,一次只能看到其中一个布局。

这样做是安全的,但不会导致 QLineEdit 出现在两个位置。如果查看 qlayout.cpp 的 QLayout::addChildWidget(QWidget * w) 方法,您将看到以下代码:

void QLayout::addChildWidget(QWidget *w)
{
    QWidget *mw = parentWidget();
    QWidget *pw = w->parentWidget();

    if (pw && w->testAttribute(Qt::WA_LaidOut)) {
        QLayout *l = pw->layout();
        if (l && removeWidgetRecursively(l, w)) {
#ifdef QT_DEBUG
            if (Q_UNLIKELY(layoutDebug()))
                qWarning("QLayout::addChildWidget: %s \"%ls\" is already in a layout; moved to new layout",
                         w->metaObject()->className(), qUtf16Printable(w->objectName()));
#endif
        }
    }
    if (pw && mw && pw != mw) {
#ifdef QT_DEBUG
            if (Q_UNLIKELY(layoutDebug()))
                qWarning("QLayout::addChildWidget: %s \"%ls\" in wrong parent; moved to correct parent",
                         w->metaObject()->className(), qUtf16Printable(w->objectName()));
#endif
        pw = nullptr;
    }

如调试消息所示,在第二次调用 addWidget() 时,小部件将移出其旧 parent-widget 和布局并移至新布局。