web-dev-qa-db-fra.com

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

Je veux créer des onglets, et j'ai lu cette réponse: Comment ajouter un onglet dans PySide

J'utilise le code dans la réponse et j'ai apporté quelques modifications. Parce que mon code doit lire certains fichiers et obtenir le nom de mes onglets à partir de ces fichiers, afin 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_()

Cela montre vraiment mes onglets. Cependant, j'ai rencontré un avertissement: QLayout: Tentative d'ajouter QLayout "" à QWidget "", qui a déjà une mise en page Puisque ce code d'onglet n'est qu'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. 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.

20
EricBkc

Lorsque vous affectez un widget en tant que parent d'un QLayout en le passant dans le constructeur, la mise en page est automatiquement définie comme mise en page pour ce widget. Dans votre code, vous faites non 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 car Qt essaie d'assigner 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)

Ici, vous définissez wid comme parent pour grid_inner. Qt veut définir grid_inner Comme disposition pour wid, mais wid a déjà une disposition comme définie ci-dessus. La modification des deux lignes ci-dessus résoudra votre problème. Vous pouvez supprimer les appels à setLayout() car 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.

Assigner le 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)
31
user3419537