尝试将名为“”的QLayout添加到QWidget“”上,但该QWidget已经有一个布局。

32

我想创建一些选项卡,并阅读了这个答案:如何在PySide中添加选项卡

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

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 already has a layout。由于这个选项卡代码只是整个代码的一部分,这个问题将阻止数据流动。而且我不知道出了什么问题。我搜索了答案,但其他答案都不是用Python编写的。

如果有人能帮助我,提前感谢。

1个回答

48

当你通过将一个小部件传递到构造函数中来将其分配为QLayout的父级时,该布局会自动设置为该小部件的布局。在您的代码中,您不仅这样做,而且明确调用了setlayout()。当传递的小部件不同时,这没有问题。如果它们不同,则会出现错误,因为Qt尝试将第二个布局分配给已经设置了布局的小部件。

您的问题在于以下几行:

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

在这里,您将wid设置为grid_inner的父级。Qt希望将grid_inner设置为wid的布局,但是如上所述,wid已经有一个布局。更改以上两行代码为此将修复您的问题。您可以删除对setLayout()的调用,因为它们是冗余的。

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

为避免混淆,请使用其中一种方法来设置布局。

将小部件指定为父级:

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

显式设置布局:

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

谢谢。我想你的意思是使用这两种方法之一可以解决问题。但我尝试了两种方法,问题仍然存在。我还有其他错误吗? - EricBkc
顺便提一下,我注意到了这个代码:如何在Python中添加一个选项卡可以完美运行。是我更改的for循环部分导致了问题的源吗? - EricBkc
经过仔细查看,我意识到你的问题出在将wid而不是wid_inner作为子项添加到grid_inner中,这会尝试重新设置wid的布局。当我测试你的代码时,我已经纠正了这个问题。我已经相应地更新了我的答案。 - user3419537

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接