QLayout: tentative d'ajouter QLayout "" à QWidget"", qui a déjà une mise en page

je veux créer un certain nombre d'onglets, et j'ai lu cette réponse: Comment ajouter un onglet dans PySide

j'utilise le code dans la réponse et apporté quelques modifications. Parce que mon code doit lire quelques fichiers et obtenir le nom de mes onglets à partir de ces fichiers, de sorte que j'ajoute une boucle for dans mon code. Et voici mon 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_()

il apparaît vraiment mes onglets. Cependant, j'ai rencontré un avertissement: QLayout: tentative d'ajouter QLayout "" à QWidget "", qui a déjà une mise en page Depuis ce code d'onglet juste une partie du code entier, le problème bloquera le flux de données. Et je n'ai aucune idée de ce qui ne va pas avec ça. J'ai cherché des réponses, mais les autres réponses ne sont pas écrites en python.

Si quelqu'un peut m'aider, merci d'avance.

18
demandé sur Community 2014-08-22 19:30:43

1 réponses

lorsque vous assignez un widget comme parent d'un QLayout en le passant dans le constructeur, le layout est automatiquement défini comme le layout de ce widget. Dans votre code, vous ne faites pas seulement cela, mais vous appelez explicitement setlayout(). Ce n'est pas un problème lorsque le widget passé est le même. S'ils sont différents, vous obtiendrez une erreur parce que Qt essaie d'attribuer la deuxième mise en page à votre widget qui a déjà eu un jeu de mise en page.

votre problème réside dans ces lignes:

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

Voici la configuration de wid comme parent pour grid_inner. Qt veut grid_inner comme la mise en page de wid, mais wid a déjà une mise en page comme défini ci-dessus. Si vous changez les deux lignes ci-dessus, votre problème sera résolu. Vous pouvez supprimer les appels à setLayout() comme ils sont redondants.

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

utilisez une méthode ou l'autre pour définir la mise en page afin d'éviter toute confusion.

Attribution d'un widget comme parent:

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

définition Explicite de la mise en page:

widget = QtGui.QWidget()
layout = QGridLayout()
widget.setLayout(layout)
25
répondu user3419537 2014-08-23 10:10:05