在Qt中将一个小部件与另一个小部件交换

时间:2010-03-10 18:05:51

标签: c++ qt layout widget

在现有视图中,将一个QGraphicsWidget与另一个“交换”的最佳方式是什么?我有一个树视图小部件和一个标签小部件,我希望它们在不同的时间占用相同的空间。具体来说,当出现错误时,我想在标签中显示它,当没有错误时,我想显示树。

我尝试以编程方式隐藏其中一个并使用hide()show()显示另一个,但问题是隐藏的小部件占用了QGraphicsLinearLayout中的空间,即使它被隐藏了,留下了空隙。或者,我想我可以添加和删除布局中的小部件,但这似乎很苛刻,因为它意味着小部件的所有权发生变化,我需要在布局中记录它们的位置,以便我可以将它们插入正确的地方。

在Java Swing中,我使用CardLayout来实现这一点,但我没有在Qt中看到等价物。

更新:我发现了QStackedWidget。但是,我正在使用QGraphicsScene,因此我的小部件不会继承QWidget,而是继承QGraphicsWidget,因此我无法将其添加到QStackedWidget。< / p>

4 个答案:

答案 0 :(得分:2)

QStackedWidget怎么样?

  

QStackedWidget类提供了一堆小部件,其中一次只能看到一个小部件。

答案 1 :(得分:1)

您可以自己轻松模拟QStackedWidget。创建您自己的小部件(无论您想要从QWidget还是从QGraphicsWidget创建,并将其放在您希望显示两个不同小部件的位置。将您的小部件放在那里,并允许它控制哪个小部件通过一些工作,你甚至可以使它足够通用,可以用作QGraphicsWidget的{​​{1}}版本。

答案 2 :(得分:1)

有一种叫做QGraphicsAnchorLayout的东西。您可以定义“锚点”(项目的边或角之间的距离),因此您可以尝试为树和标签定义相同的锚点并适当地隐藏窗口小部件。由于两个小部件将占据相同的区域,因此在隐藏一个项目后应该没有间隙。

答案 3 :(得分:0)

将QWidget添加到布局时,布局的所有者将不会获得窗口小部件的所有权。您必须将您的窗口小部件添加为其他QWidget的子窗口(通常在子窗口的构造函数中传递父窗口)。

因此,从lyout中删除小部件只会将其从布局所有者的显示行为中删除。

在您的情况下,您可以从布局中删除小部件并将其隐藏。如果要再次显示它,请显示它并将小部件添加到布局中。要将其插入正确的位置,您必须在删除它时保存它的位置。

希望有所帮助