在QSCrollarea中的两个小部件之间切换



我有一个带有窗口小部件的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
// ...

相关内容

  • 没有找到相关文章

最新更新