【问题标题】:PyQt5: Can't reload previously used QWidget?PyQt5:无法重新加载以前使用的 QWidget?
【发布时间】:2020-10-05 00:52:05
【问题描述】:

我目前正在为我目前工作的学生宿舍编写某种酒吧标签保存功能。 为此,我有两个不同的 QScrollAreas 和两个 QWidget,每个 QGridLayout 都有一个。一个用于用户选择,另一个用于选择要购买的项目。

当我切换到项目选择界面时一切正常 self.scrollArea.setWidget(self.itemWidget),但是我还实现了一个后退按钮,以防选择了错误的用户,这应该回到第一个 QWidget 启动:self.scrollArea.setWidget(self.userWidget),在我看来应该只是再次加载以前构建的布局,但我得到这个错误:

RuntimeError: wrapped C/C++ object of type QWidget has been deleted

我哪里做错了?有谁能帮帮我吗?

【问题讨论】:

  • 基于 Web 的解决方案怎么样,例如github.com/FREILab/unary?
  • @ypnos 提出一个完全不同的框架有什么意义?
  • 根据我对这些东西的经验,我认为使用 Qt 对于这个应用程序来说不是很实用。不过我也回答了这个问题。
  • 感谢您的建议,但是我没有太多时间,因此也没有时间学习新框架:/

标签: python qt pyqt pyqt5 qt5


【解决方案1】:

documentation for setWidget() 明确指出:

widget 成为滚动区域的子项,并在删除滚动区域或设置新的widget 时销毁。

您需要做的是在设置另一个小部件之前先调用takeWidget()。

或者,您可以使用QStackedWidget 作为两个小部件的容器。

【讨论】:

  • 好的,谢谢。我究竟如何使用 takeWidget()?我用 QStackedWidget 代替什么?我是否将 QStackedWidget 作为 QScrollArea 的中心小部件,然后在我已经拥有的其他两个小部件之间切换?
  • 嘿!没关系,我想通了!我只是通过在 scrollArea 上调用 takeWidget() 来重新分配 self.itemWidget。您能否让我知道如何将 QStackedWidget 与 QScrollArea 一起使用以供将来参考?当我将 QStackedWidget 附加到 QScrollArea 然后将预先存在的 Widget 附加到我的 QStackedWidget 时,它不再显示任何内容...
  • 我很难理解滚动区域中的堆叠小部件出了什么问题,但还有其他人报告了 SO 上的组合问题。也许您只是坚持使用滚动区域。
  • 好的!再次感谢!
猜你喜欢
  • 2019-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多