当前位置: 首页 > 面试题库 >

用另一个布局替换QWidget上的布局

齐成和
2023-03-14
问题内容

我有一个小部件,当切换选项时,它会改变。这会使所有布局和小部件失效。我保留所有布局的列表,因此可以使用类似于以下答案的方法删除它们:

class MyWidget(QFrame):
   # ...
   def reLayout(self):
      def deleteLayoutChilds(l):
         while l.count():
            item=l.takeAt(0)
            widget=item.widget()
            if widget: widget.deleteLater()
            else: deleteLayoutChilds(item.layout())
      for l in self.allLayouts: deleteLayoutChilds(l)

      # now install the new layout
      ##
      ## how to delete the old layout first?
      l=self.layout(); del l # no effect
      #
      layout=QGridLayout(self)
      ## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout.

如何摆脱旧的布局并设置新的布局?

该文档非常简洁,显然不适用于python:

QWidget.setLayout(self,QLayout)

QLayout参数将其所有权转移到Qt。

将此窗口小部件的布局管理器设置为布局。

如果此小部件上已经安装了布局管理器,则QWidget将不允许您安装另一个。必须先删除现有的布局管理器(由layout()返回),然后才能使用新布局调用setLayout()。

如果layout是另一个窗口小部件上的布局管理器,则setLayout()将使布局父级化,并使它成为此窗口小部件的布局管理器。

例:

 QVBoxLayout *layout = new QVBoxLayout;
 layout->addWidget(formWidget);
 setLayout(layout);

调用此函数的另一种方法是将此小部件传递给布局的构造函数。

QWidget将获得布局的所有权。

另请参见layout()和Layout Management。


问题答案:

您可以简单地将布局重新设置为一个临时小部件:

def reLayout(self):
    QWidget().setLayout(self.layout())
    layout = QGridLayout(self)
    ...

这样会将所有子窗口小部件重新添加到该临时对象中,并且该对象及其新子对象将被立即删除,因为我们没有对其进行引用。

但是,为单个窗口小部件提供多种布局并能够在它们之间进行切换的典型方法是使用QStackedWidgetQStackedLayout

并且,如果您仍然需要该次要问题的答案:

如何先删除旧版面?

看来您无法直接删除QObject具有父项的,因为父项保留对该对象的引用。但是您可以将对象添加到一个临时对象QObjectCleanupHandler中,与上述解决方案一样,该临时对象将立即随其包含的对象一起删除:

QObjectCleanupHandler().add(self.layout())


 类似资料:
  • 问题内容: 我正在PyQt4中创建一个应用程序,到目前为止,这是我的代码: 我的问题在。我尝试设置布局,但是即使这是我第一次使用该表格,也会出现错误,这使我感到困惑。 QWidget :: setLayout:尝试在MainWindow“”上设置QLayout“”,该窗口已经具有布局 问题答案: 您不能直接在上设置。您需要创建一个并将其设置为上的 中央窗口小部件 ,然后将其分配给该 窗口小部件。

  • 我的应用程序有一个显示当前位置的谷歌地图的父布局,还有一个子布局,在谷歌地图上从屏幕底部向上移动,但只移动到屏幕的一半。我用下面的代码实现了这一切。 向上滑动和向下滑动的动画: 滑下去。xml slide_up.xml 主要活动: 子布局 父布局 问题是 如果地图被放大以扩展,如果子布局向上滑动,则我的地图标记会隐藏在子布局后面。我想在这种情况下,我的地图应该自动向上滑动。 就像Whatsspp聊

  • 问题内容: 什么功能可以用另一个字符串替换一个字符串? 实例1:将替代哪些用? 例2:将替代哪些用? 问题答案: 该方法是你要寻找的。 例如:

  • 注意: Adobe Muse 不再添加新增功能,并将于 2020 年 3 月 26 日停止支持。有关详细信息和帮助,请参阅 Adobe Muse 服务结束页面。 Adobe Muse 2016 年 2 月发布的版本及更高版本支持响应式设计。如果您在早于 2016 年 2 月的版本中创建了网站,则可以将您的网站转换为响应式设计。 为何要迁移到响应式布局? 如果已有使用替代布局的 Adobe Muse

  • 我正试图在另外两个文本视图的左边设置一个文本视图。我想我可以使用某种容器将它们分组,然后将第一个textview设置到包含其他两个textview的容器的左侧。但我找不到任何有效的方法。 我尝试使用relativelayout将它们组合在一起,但它似乎只填充了整个屏幕宽度,并使第一个文本视图位于屏幕的左侧。 如果我将包含其他两个文本视图的relativelayout设置为第一个文本视图的右侧,它会

  • Tabris.js使用原生平台的能力来对UI界面进行布局。由于显示密度在移动设备之间差异很大,因此Tabris.js中的像素始终用设备独立像素表示。 布局数据 全部控件都支持layoutData属性,该属性定义了控件的排列方式。layoutData的值必须是下列属性组成的一个对象: left right top bottom centerX centerY baseline width heigh