【问题标题】:Qt: Same Widget Inside Two Different LayoutsQt:两个不同布局中的相同小部件
【发布时间】:2011-04-15 02:02:42
【问题描述】:

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

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

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

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

现在假设这两种布局都托管在“根”布局中,并且该根布局可以调整为比高更宽的“横向”模式,以及比高比宽的“纵向”模式。

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

我不知道我在这里是否有意义,但这是我的问题。也许当调用 switch 事件时,所有子小部件和布局都应该调整大小,所以它看起来总是正确的。唯一的问题是我不知道怎么做。

【问题讨论】:

标签: qt layout


【解决方案1】:

这不是更改布局的通用解决方案,但在您的情况下是一个简单的解决方案:只需更改 boxlayout 的方向。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 我决定编写一个在方向改变时自动调用的方法,该方法(删除后)将小部件再次添加到布局中。
    猜你喜欢
    • 2012-09-20
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    相关资源
    最近更新 更多