【发布时间】:2018-02-24 15:26:04
【问题描述】:
我有一个 QScrollArea 包含一个小部件来选择一些东西。选择后,滚动区域中的小部件应切换到另一个小部件。用户还可以返回并再次获取选择小部件以选择其他内容。
但我总是遇到错误。看来这是问题所在:
QScrollArea -> SetWidget() : [...] 小部件成为滚动区域的子级,并在删除滚动区域或设置新小部件时被销毁。 [...]
这很好用。 我在构造函数中添加了这样的选择小部件:
// Configure Window List setup
QVBoxLayout* sc_layout = new QVBoxLayout(&w_window_select);
// ... add some stuff into it ...
ui.scrollArea->setWidget(&w_window_select);
我像这样更改小部件:
ui.scrollArea->setWidget(&w_window_select);
w_window_select.show();
// or
ui.scrollArea->setWidget(&lb_img);
lb_img.show();
一开始,我在课堂上保存了一个指向 w_window_select 和 lb_img 的指针,但我认为,当我第一次切换小部件时,我的旧小部件将被删除。我以为我可以将其更改为普通班级成员以防止删除并且它可以工作,但它也会崩溃。
HEAP[Program.exe]:指定给 RtlValidateHeap(0000000000350000, 000000000020F3C8) 的地址无效
我该如何解决这个问题?我可以在每次需要再次切换时创建小部件(它们不是那么大),但对我来说,这看起来像是一个愚蠢的解决方案。
【问题讨论】:
-
不确定我是否完全理解您的问题,但我认为
QScrollArea::takeWidget可能有用。它“删除滚动区域的小部件,并将小部件的所有权传递给调用者”。 -
@G.M.这完美!我现在这样使用它: w_window_select = ui.scrollArea->takeWidget(); ui.scrollArea->setWidget(lb_img); lb_img->show();非常感谢。如果您将此作为答案发布,我会用您的答案将其标记为已解决。
标签: qt qwidget qscrollarea