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

8
什么是在现有视图中“交换”一个QGraphicsWidget与另一个的最佳方法?我有一个树形视图小部件和一个标签小部件,我想让它们在不同的时间占据相同的空间。具体来说,当出现错误时,我想在标签中显示它,而当没有错误时,我想显示树形结构。
我尝试使用hide()show()以编程方式隐藏一个并显示另一个,但问题是即使它被隐藏,隐藏的小部件仍然占据我的QGraphicsLinearLayout中的空间,留下一个空的间隙。或者,我可以将小部件从布局中添加和删除,但这似乎是笨重的,因为它意味着小部件的所有权发生了变化,我需要记录它们在布局中的位置,以便我可以把它们放回正确的位置。
在Java Swing中,我会使用CardLayout来实现这一点,但我在Qt中没有看到等效物。
更新:我发现QStackedWidget。但是,我正在使用QGraphicsScene,所以我的小部件不是继承自QWidget,而是继承自QGraphicsWidget,因此我无法将它们添加到QStackedWidget中。
4个回答

3

那么 QStackedWidget 呢?

QStackedWidget 类提供了一个小部件堆栈,只有一个小部件可见。


在第一次尝试中,这似乎是理想的解决方案。但我正在使用QGraphicsScene,并且我的小部件不是从QWidget继承而来,而是从QGraphicsWidget继承而来,因此我无法将它们添加到QStackedWidget中。我会更新问题以澄清这一点。 - Rob H

1

你可以比较容易地自己模拟一个QStackedWidget。创建你自己的小部件(你想用什么方式都可以,从QWidgetQGraphicsWidget),并把它放在你想要出现两个不同小部件的位置。将你的小部件放在其中,并允许其控制哪一个可见。稍加改进,甚至可以使它通用到作为QStackedWidgetQGraphicsWidget版本。


这与我第一次尝试在小部件上调用hide()和show()有何不同?问题在于隐藏小部件后留下的空白间隙。 - Rob H
@Rob H:不同之处在于,这种情况下你有一个小部件占据了线性布局中的空间。该小部件会更改它所显示的内容,但不应影响其周围任何物品的间距。我默认认为包含两个其他小部件的小部件不应使用布局,而仅应将它们放置在它们应该出现的位置,并根据需要显示/隐藏每个小部件。 - Caleb Huitt - cjhuitt
啊,现在我明白了。这是个有趣的想法,加一分。不过如果可能的话,我会选择锚点布局答案。 - Rob H

1

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


嗯...我会调查一下并回报。谢谢你的指引! - Rob H

0

当您将QWidget添加到布局中时,布局的所有者不会拥有您的小部件。您必须将您的小部件作为另一个QWidget的子级添加(通常在子级构造函数中传递父级)。

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

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

希望能有所帮助


2
关于布局中小部件的所有权,您有点误解了 - 当通过setLayout方法将布局安装在小部件上时,所有子项都会自动重新分配父项。因此,您不需要为子小部件指定父项。 - chalup
这基本上是我在问题中描述的“粗暴”方法。我希望有更简单明了的方法。(我认为chalup在所有权问题上是正确的。QGraphicsLinearLayout.removeAt的文档说所有权转移给调用者。) - Rob H
你尝试过使用自定义布局吗?在该布局中,隐藏的小部件将在定位期间被忽略。这可能会解决问题。 - Patrice Bernassola

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接