开发者

fixing child layout/widget position in QT

I wanted to know whether is there any way of fixing child layouts within a parent layout. For example...

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

Now this ends up as four buttons/layouts in a vertical layout in the sequence that they are added. But if I remove buttons/layouts "one", "two" and "three"...

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

After doing this, the pushbutton "four" will move up the layout as you remove widgets on top of "four". I don't want this to happen.

Is there any way that even if I remove the widget/layout on top, I need that last widget/layout to stay where it is currently. How do I achieve this ?

UPDATE: Well I was experimenting and I was kind of able to achieve what I wanted using QGridLayout. Here is the code, but I am using QGridLayout instead of 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);

If I delete the above three buttons, the fourth one stays where it is, because of QT::AlignBottom , it does not work without that thing. Here 开发者_C百科is the SLOT remove_btns()

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

When I click "one", top three buttons vanish, and the fourth one stays where it is. But it does not work if I don't give the QT::AlignBottom . Also, these alignment things are a mystery to me, I am unable to find how exactly they work.

This is definitely NOT an answer..., because I don't understand how it worked :P


If you are immediately replacing the widgets you removed, you can always insert your new widgets by index.

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


Yes, just hide the widgets instead of removing them:

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

If you really have to remove the widgets, perhaps you can replace them with some lightweight widget like a QLabel with no text.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜