我有一个带有窗口小部件的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(000000000000350000,00000000000020F3C8(
的无效地址
我该如何解决这个问题?每次我需要再次切换时,我都可以创建小部件(它们不是那么大(,但是对我来说,这看起来像一个愚蠢的解决方案。
答案是 @g.m。
的评论不确定我完全理解您的问题,但我认为QSCrollarea :: Takewidget可能会证明有用。它"删除了滚动区域的小部件,并将小部件的所有权传递给呼叫者"。
代码:
w_window_select = ui.scrollArea->takeWidget();
ui.scrollArea->setWidget(lb_img);
lb_img->show();
切换到新的小部件。
如果有多个小部件要切换会发生什么?您不能仅使用takeWidget()
将先前设置的小部件分配给"其"指针,因为您不知道它是哪个小部件-Widgets可以按任何顺序加载。
这是我在思考后发现的一种工作解决方案。A,B是QWidget
指针,SA是QScrollArea
指针。以下应在任何数量的Qwidgets之间进行切换:
// setting A for the first time
SA->setWidget(A);
A = SA->widget(); // having the pointer for future usage
// setting B without deleting A
SA->takeWidget(); // necessary to prevent deletion of previously set widget
SA->setWidget(B);
B = SA->widget(); // having the pointer for future usage
// setting A again. The object is the same.
SA->takeWidget(); // necessary to prevent deletion of previously set widget
SA->setWidget(A);
A = SA->widget(); // having the pointer for future usage
// ...