QLayout:尝试添加 QLayout “"到QWidget“",它已经有一个布局

2022-01-09 00:00:00 python pyside qwidget qlayout tabs

问题描述

我想创建一些标签,我阅读了这个答案:如何在 PySide 中添加标签

I want to create some tabs, and I read this answer: How to add a tab in PySide

我使用答案中的代码并进行了一些更改.因为我的代码必须读取一些文件并从这些文件中获取我的选项卡的名称,所以我在我的代码中添加了一个 for 循环.这是我的代码.

I use the code in the answer and made some changes. Cause my code has to read some files and get the name of my tabs from those file, so that I add a for loop in my code. And here is my code.

from PySide import QtCore, QtGui
import sys
import dflash_controller as con

if __name__ == "__main__":
    list = [['a', 3], ['b', 4], ['c', 5], ['d', 6]]
    app = QtGui.QApplication(sys.argv)
    wid = QtGui.QWidget()
    grid = QtGui.QGridLayout(wid)
    wid.setLayout(grid)

    # setting the inner widget and layout
    grid_inner = QtGui.QGridLayout(wid)
    wid_inner = QtGui.QWidget(wid)
    wid_inner.setLayout(grid_inner)

    # add the inner widget to the outer layout
    grid.addWidget(wid_inner)

    # add tab frame to widget
    wid_inner.tab = QtGui.QTabWidget(wid_inner)
    grid_inner.addWidget(wid_inner.tab)

    # create tab


    for i, index in enumerate(list[0:]):
        new_tab = QtGui.QWidget(wid_inner.tab)
        grid_tab = QtGui.QGridLayout(new_tab)
        grid_tab.setSpacing(10)
        wid_inner.tab.addTab(new_tab, index[0])
        new_tab.setLayout(grid_tab)


    wid.show()
    app.exec_()

它确实显示了我的标签.但是,我遇到了一个警告:QLayout: Attempting to add QLayout "" to QWidget "", which has a layout由于此选项卡代码只是整个代码的一部分,因此问题将阻塞数据流.而且我不知道它有什么问题.我搜索了答案,但其他答案不是用 python 编写的.

It really shows up my tabs. However, I met a warning: QLayout: Attempting to add QLayout "" to QWidget "", which already has a layout Since this tab code just a part of the whole code, the problem will block the data flow. And I have no idea what's wrong with it. I searched for answers, but other answer aren't written in python.

如果有人可以帮助我,在此先感谢.

If anyone can help me, thanks in advance.


解决方案

当您通过将小部件传递给构造函数将其分配为 QLayout 的父级时,布局会自动设置为布局对于那个小部件.在您的代码中,您不仅要这样做,还要显式调用 setlayout().当传递的小部件相同时,这没有问题.如果它们不同,您将收到错误消息,因为 Qt 尝试将第二个布局分配给您已经设置了布局的小部件.

When you assign a widget as the parent of a QLayout by passing it into the constructor, the layout is automatically set as the layout for that widget. In your code you are not only doing this, but explicitly calling setlayout(). This is no problem when when the widget passed is the same. If they are different you will get an error because Qt tries to assign the second layout to your widget which has already had a layout set.

您的问题在于以下几行:

Your problem lies in these lines:

grid_inner = QtGui.QGridLayout(wid)
wid_inner = QtGui.QWidget(wid)

在这里,您将 wid 设置为 grid_inner 的父级.Qt 想将 grid_inner 设置为 wid 的布局,但 wid 已经有了上面设置的布局.将以上两行更改为此将解决您的问题.您可以删除对 setLayout() 的调用,因为它们是多余的.

Here you are setting wid as the parent for grid_inner. Qt wants to set grid_inner as the layout for wid, but wid already has a layout as set above. Changing the above two lines to this will fix your problem. You can remove calls to setLayout() as they are redundant.

wid_inner = QtGui.QWidget(wid)
grid_inner = QtGui.QGridLayout(wid_inner)

使用一种方法或另一种方法来设置布局以避免混淆.

Use one method or the other for setting the layout to avoid confusion.

将小部件指定为父级:

widget = QtGui.QWidget()
layout = QGridLayout(widget)

显式设置布局:

widget = QtGui.QWidget()
layout = QGridLayout()
widget.setLayout(layout)

相关文章