代码之家  ›  专栏  ›  技术社区  ›  Kingsley

在版面之间共享QLineEdit可以吗?

  •  0
  • Kingsley  · 技术社区  · 2 年前

    我正在调试一些在两个布局框之间使用相同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?
    

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

    1 回复  |  直到 2 年前
        1
  •  1
  •   Jeremy Friesner    2 年前

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

    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() ,小部件将从其旧的父部件和布局中移出,并移到新的父部件和布局中。