Qt:两个不同布局中的相同小部件

时间:2010-09-21 08:33:03

标签: qt layout

我想要实现的是窗口小部件可以存在于两种不同的布局中,在本例中是QHBoxLayout和QVBoxLayout。我正在实现一个系统,当设备的屏幕方向改变时,它会在两个布局之间动态切换。

目前我正在创建,假设一个名为MyWidget的复杂复合窗口小部件并将其添加到两个不同的布局中:

MyWidget *wgt = new QWidget();
QVBoxLayout vlayout;
QHBoxLayout hlayout;

vlayout->addWidget(wgt);
hlayout->addWidget(wgt);

现在想象两个布局都在“根”布局中托管,并且这个根布局可以调整为更宽的高度“横向”模式,并且可以调整为高于宽“纵向”模式。

MyWidget仅在添加到的第一个布局中正确显示,并且在切换布局时,它显示所有错误或根本不显示。

我不知道我在这里是否有任何意义,但这是我的问题。也许当调用switch事件时,应调整所有子窗口小部件和布局的大小,因此它总是看起来正确。唯一的问题是我不知道如何。

2 个答案:

答案 0 :(得分:13)

这不是改变布局的一般解决方案,而是一个简单的解决方案:只需改变boxlayout的方向。

hlayout->setDirection(QBoxLayout::TopToBottom);
// now your hboxlayout works as vertical layout

hlayout->setDirection(QBoxLayout::LeftToRight);
// and now it is horizontal again

答案 1 :(得分:4)

这不是特别容易做到,但是可能。

首先,我建议您实际创建两个不同的小部件,一个用于垂直,一个用于水平,并以这种方式管理。如果源数据与UI类正确分离,您应该能够毫不费力地这样做,但会产生一些内存开销。

根据您的需要,一种方法是从一个布局中完全remove the widgets,并在需要更改屏幕上的排列时将它们添加到另一个布局,并更改添加到窗口小部件的布局。这应该导致以不同的方式绘制相同的小部件。

另一种更复杂的处理方式(虽然可能更有效)是write your own layout并让它根据方向变化处理重新排列小部件。