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

时间:2018-02-24 15:26:05

标签: qt qwidget 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指定的地址无效(0000000000350000,000000000020F3C8)

我该如何解决这个问题?每次我需要再次切换时,我都可以创建小部件(它们不是那么大),但对我来说,这看起来像是一个愚蠢的解决方案。

3 个答案:

答案 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