我有一个带有包含小部件的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)
我该如何解决这个问题?每次我需要再次切换时,我都可以创建小部件(它们不是那么大),但对我来说,这看起来像是一个愚蠢的解决方案。
答案 0 :(得分:1)
答案是来自@ G.M的评论。
我不确定我是否完全理解您的问题,但我认为QScrollArea :: takeWidget可能会很有用。它“删除滚动区域的小部件,并将小部件的所有权传递给调用者”。
代码:
w_window_select = ui.scrollArea->takeWidget();
ui.scrollArea->setWidget(lb_img);
lb_img->show();
在切换到新窗口小部件之前拍摄小部件。
答案 1 :(得分:0)
如果有多个小部件可以切换会怎样?您不能仅使用takeWidget()
来将先前设置的窗口小部件分配给“它”的指针,因为您不知道它是哪个窗口小部件-可以按任何顺序加载小部件。
这是我经过一番思考后发现的可行解决方案。 A,B是QWidget
指针,SA是QScrollArea
指针。以下应该可以在任意数量的QWidget之间进行切换:
// 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
// ...
答案 2 :(得分:-1)
这有帮助吗?
SSL URL