【问题标题】:Switch between two widgets in QScrollArea在 QScrollArea 中的两个小部件之间切换
【发布时间】: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


【解决方案1】:

答案是来自@G.M.的评论

不确定我是否完全理解您的问题,但我认为 QScrollArea::takeWidget 可能有用。它“删除滚动区域的小部件,并将小部件的所有权传递给调用者”。

代码:

w_window_select = ui.scrollArea->takeWidget(); 
ui.scrollArea->setWidget(lb_img); 
lb_img->show();

在切换到新的小部件之前获取小部件。

【讨论】:

    【解决方案2】:

    如果有多个小部件可以切换会发生什么?您不能只使用takeWidget() 将先前设置的小部件分配给“其”指针,因为您无法知道它是哪个小部件 - 小部件可以按任何顺序加载。

    这是我经过一番思考后找到的可行解决方案。 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
    
    // ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多