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

Ger*_*ann 9 layout qt

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

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

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

vlayout->addWidget(wgt);
hlayout->addWidget(wgt);
Run Code Online (Sandbox Code Playgroud)

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

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

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

小智 13

这不是更改布局的一般解决方案,而是您的简单解决方案:只需更改boxlayout的方向即可.

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

hlayout->setDirection(QBoxLayout::LeftToRight);
// and now it is horizontal again
Run Code Online (Sandbox Code Playgroud)


Cal*_*itt 4

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

首先,我建议您实际上创建两个不同的小部件,一个用于垂直,一个用于水平,并以这种方式管理事物。如果源数据与 UI 类正确分离,您应该能够在没有太多麻烦的情况下做到这一点,但会产生一些内存开销。

一种按照您的意愿进行操作的方法是,当您需要更改屏幕上的排列并更改添加到小部件的布局时,从一种布局中完全删除小部件并将它们添加到另一种布局中。这应该会导致相同的小部件以不同的方式绘制。

处理此问题的一种不同的、更复杂的方法(尽管可能更有效)是编写自己的布局并让它根据方向变化处理重新排列小部件。