可以在布局之间共享 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 和布局并移至新布局。
我正在调试一些在两个布局框之间使用相同 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 和布局并移至新布局。