【问题标题】:fixing child layout/widget position in QT修复 QT 中的子布局/小部件位置
【发布时间】:2011-09-29 21:31:36
【问题描述】:

我想知道是否有任何方法可以在父布局中修复子布局。比如……

QVBoxLayout *vbox = new QVBoxLayout;
// adding pushbuttons/layouts...
vbox->addWidget(one);
vbox->addWidget(two);
vbox->addWidget(three);
vbox->addWidget(four);

现在,这最终以添加顺序的垂直布局中的四个按钮/布局结束。但如果我删除按钮/布局“一”、“二”和“三”...

vbox->removeWidget(one);
vbox->removeWidget(two);
vbox->removeWidget(three);

完成此操作后,当您删除“四个”顶部的小部件时,“四个”按钮将在布局上向上移动。我不希望这种情况发生。

有什么方法可以即使我删除顶部的小部件/布局,我也需要最后一个小部件/布局保持在当前位置。 我如何做到这一点?

更新:嗯,我正在试验,我有点能够使用 QGridLayout 实现我想要的。这是代码,但我使用的是 QGridLayout 而不是 QVBoxLayout。

connect(one,SIGNAL(clicked()),this,SLOT(remove_btns()));

g = new QGridLayout(this);
g->addWidget(one,0,0,1,2);
g->addWidget(two,1,0,1,2);
g->addWidget(three,2,0,1,2);
g->addWidget(four,3,0,1,2,Qt::AlignBottom);
setLayout(g);

如果我删除上面的三个按钮,第四个按钮会留在原处,因为 QT::AlignBottom ,没有那个东西就行不通。 这是 SLOT remove_btns()

void test::remove_btns()
{
    g->removeWidget(one);
    g->removeWidget(two);
    g->removeWidget(three);
    delete one;
    delete two;
    delete three;
}

当我单击“一个”时,前三个按钮消失,第四个按钮留在原处。但如果我不给出 QT::AlignBottom ,它就不起作用。此外,这些对齐的东西对我来说是个谜,我无法找到它们究竟是如何工作的。

这绝对是不是答案...,因为我不明白它是如何工作的:P

【问题讨论】:

    标签: qt


    【解决方案1】:

    如果您要立即替换已删除的小部件,则始终可以按索引插入新的小部件。

    void insertWidget ( int index, QWidget * widget, int stretch = 0, Qt::Alignment alignment = 0 )
    

    【讨论】:

      【解决方案2】:

      是的,只需隐藏小部件而不是移除它们:

      one->hide();
      two->hide();
      three->hide();
      

      如果您确实必须删除这些小部件,也许您可​​以将它们替换为一些轻量级的小部件,例如不带文本的 QLabel

      【讨论】:

      • 其实我希望以前的小部件被新的小部件替换,那么我可以通过隐藏以前的小部件来显示新的小部件吗?无论如何,隐藏的对象会占用内存,我不希望这样。
      • @aditya - 使用 QStackedLayout 或 QStackedWidget。只要它们具有相同的大小,并且您在删除旧的之前添加新的,那么这样做应该没有任何问题。
      • 好的。我从来没有使用过这个 Stacked Widget,因为我是新手,所以我会试一试。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多