我正在向这样的Station
添加小部件行(使用按钮):
QGridLayout
删除像这样的小部件行:
def ajouter_un_mot_vocab(self) :
'''
'''
# Dictionnaire des mots de vocabulaire
self.dico_vocab_mot = {}
# Dictionnaire des définitions des mots de vocabulaire
self.dico_vocab_def = {}
# Liste pour chargement des données
# (écriture des textes par l'utilisateur)
self.liste_mots_vocabulaire = []
print
print 'self.grille_3_stack_3.rowCount() creation', self.grille_3_stack_3.rowCount()
print
#
for r in range(self.grille_3_stack_3.rowCount()) :
# Création des widgets et taille générique
self.dico_vocab_mot[r] = QTextEdit()
self.dico_vocab_def[r] = QTextEdit()
self.dico_vocab_mot[r].setMaximumWidth(180)
self.dico_vocab_mot[r].setMinimumWidth(180)
self.dico_vocab_mot[r].setMaximumHeight(54)
self.dico_vocab_mot[r].setMinimumHeight(54)
self.dico_vocab_def[r].setMaximumHeight(54)
self.dico_vocab_def[r].setMinimumHeight(54)
print 'r', r
# Conditions de redimensionnement
if r > 5 :
self.dico_vocab_mot[r].setMaximumHeight(34)
self.dico_vocab_mot[r].setMinimumHeight(34)
self.dico_vocab_def[r].setMaximumHeight(34)
self.dico_vocab_def[r].setMinimumHeight(34)
# Répartition dans la grille
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r], r+1, 0)
self.grille_3_stack_3.addWidget(self.dico_vocab_def[r], r+1, 1)
# Ecriture des n°s de lignes dans la partie mots de vocabulaire
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r].setText(str(r+1)+'. '), r+1, 0)
# Les données sont introduites dans une liste
self.liste_mots_vocabulaire.append([self.dico_vocab_mot[r], self.dico_vocab_def[r]])
# =====================================================
# Signaux
self.dico_vocab_mot[r].textChanged.connect(self.changements_phase_3)
self.dico_vocab_def[r].textChanged.connect(self.changements_phase_3)
# =====================================================
print 'self.dico_vocab_mot', self.dico_vocab_mot
print 'self.dico_vocab_def', self.dico_vocab_def
print self.liste_mots_vocabulaire
第一次,当我添加小部件行(例如五行小部件)时,一切都运行良好。如果我删除行(例如两行小部件),一切都很好。但是一旦我决定再次添加一行(删除后),它就无法正常工作:我最终有六行,而我应该有三行。
必须是我的代码才能删除无法正常工作的行(但这些行会被直观删除)。我做错了什么?
答案 0 :(得分:0)
QGridLayout
在移除小部件时不会删除任何行 - 但空行不会占用任何空间,因此您通常不会注意到它们。如果添加小部件超出当前行数,则布局将简单地增长到所需的大小。因此,如果当前行数为5
,并且您在行10
添加了一个小部件,则行数将立即更改为10
,并将创建五个空插入行。
网格布局始终以行数为1开头。但是在您的代码中,您在添加小部件时使用r + 1
:
for r in range(self.grille_3_stack_3.rowCount()):
...
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r], r+1, 0)
self.grille_3_stack_3.addWidget(self.dico_vocab_def[r], r+1, 1)
# Ecriture des n°s de lignes dans la partie mots de vocabulaire
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r].setText(str(r+1)+'. '), r+1, 0)
这将跳过第一行,并开始添加行索引1
的小部件。因此,在添加五行小部件之后,行计数将六,而不是五行。每次删除和重新添加小部件时,行数都会增加一个。
您的代码应该如下所示:
for r in range(self.grille_3_stack_3.rowCount()):
...
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r], r, 0)
self.grille_3_stack_3.addWidget(self.dico_vocab_def[r], r, 1)
self.dico_vocab_mot[r].setText(str(r+1)+'. ')
(请注意,我在这里修了最后一行,以前没有意义)。
修改强>:
根据评论,以下是所需的更改,以便在每次单击第一个按钮时添加一行,并在单击第二个按钮时清除所有行。
class EssaiQStackedWidget_Seq_Prof(QWidget) :
def __init__(self, parent=None):
...
self.dico_vocab_mot = {}
self.dico_vocab_def = {}
self.liste_mots_vocabulaire = []
self.liste_menu.currentIndexChanged.connect(self.affiche_phases)
def ajouter_un_mot_vocab(self) :
r = len(self.liste_mots_vocabulaire)
self.dico_vocab_mot[r] = QTextEdit()
self.dico_vocab_def[r] = QTextEdit()
self.dico_vocab_mot[r].setMaximumWidth(180)
self.dico_vocab_mot[r].setMinimumWidth(180)
self.dico_vocab_mot[r].setMaximumHeight(54)
self.dico_vocab_mot[r].setMinimumHeight(54)
self.dico_vocab_def[r].setMaximumHeight(54)
self.dico_vocab_def[r].setMinimumHeight(54)
if r > 5 :
self.dico_vocab_mot[r].setMaximumHeight(34)
self.dico_vocab_mot[r].setMinimumHeight(34)
self.dico_vocab_def[r].setMaximumHeight(34)
self.dico_vocab_def[r].setMinimumHeight(34)
self.grille_3_stack_3.addWidget(self.dico_vocab_mot[r], r, 0)
self.grille_3_stack_3.addWidget(self.dico_vocab_def[r], r, 1)
self.dico_vocab_mot[r].setText(str(r+1)+'. ')
self.liste_mots_vocabulaire.append([self.dico_vocab_mot[r], self.dico_vocab_def[r]])
self.dico_vocab_mot[r].textChanged.connect(self.changements_phase_3)
self.dico_vocab_def[r].textChanged.connect(self.changements_phase_3)
def supprimer_un_mot_vocab(self) :
row = len(self.liste_mots_vocabulaire) - 1
if row >= 0:
for column in range(self.grille_3_stack_3.columnCount()):
item = self.grille_3_stack_3.itemAtPosition(row, column)
if item is not None:
item.widget().deleteLater()
del self.liste_mots_vocabulaire[row]
del self.dico_vocab_mot[row]
del self.dico_vocab_def[row]