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.
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)