2017-09-06 8 views
0

J'ai un QTableWidget sur lequel je travaille qui est supposé ajouter dynamiquement des lignes avec des comboboxes sur certaines cellules, chaque fois que l'utilisateur appuie sur un bouton appelé Add Cases. J'ai les parties principales fonctionnantes, mais le problème que j'ai est d'essayer d'obtenir le texte de la liste déroulante. Dans le code suivant, j'ai une fonction appelée def clearcases() comme une fonction fictive pour le test. Je comprends que chaque fois que j'ajoute une ligne, les références des lignes précédentes sont supprimées, c'est pourquoi je ne peux pas y accéder, j'ai donc essayé de créer une liste qui gardera une trace de tous les objets de la liste déroulante.QTableWidget lignes dynamiques w/QComboBox

Je reçois cette erreur avec le code actuel

Erreur:

Traceback (most recent call last): 
    File "C:\Users\Desktop\VLS.py", line 3888 in clearcases 
    print(TotalLift[0].currentText() 
RuntimeError: wrapped C/C++ object of type QComboBox has been deleted 

TotalLift = [] 
LiftBox = {} 
TotalReed = [] 
ReedBox = {} 
def addcases(self): 
    row = self.tableWidget.rowCount() 
    self.tableWidget.insertRow(row) 
    for x in range(1, 33): 
     self.tableWidget.setVerticalHeaderItem(row, QTableWidgetItem('Case ' + chr(ord('A') + row))) 
     for i in range(0, 4): 
      LiftBox[i] = QtWidgets.QComboBox() 
      Lift = ['', 'N', 'M', 'H'] 
      LiftBox[i].addItems(Lift) 
      TotalLift.append(LiftBox[i]) 
      ReedBox[i] = QtWidgets.QComboBox() 
      Reed = ['', 'B', 'C', 'D', 'E', 'O', 'P'] 
      ReedBox[i].addItems(Reed) 
     self.tableWidget.setCellWidget(row, 2, ReedBox[0]) 
     self.tableWidget.setCellWidget(row, 3, LiftBox[0]) 
     self.tableWidget.setCellWidget(row, 4, ReedBox[1]) 
     self.tableWidget.setCellWidget(row, 5, LiftBox[1]) 
     self.tableWidget.setCellWidget(row, 6, ReedBox[2]) 
     self.tableWidget.setCellWidget(row, 7, LiftBox[2]) 
     self.tableWidget.setCellWidget(row, 8, ReedBox[3]) 
     self.tableWidget.setCellWidget(row, 9, LiftBox[3]) 
def clearcases(self): 
    print(TotalLift[0].currentText()) 

enter image description here Ma question générale est, comment puis-je obtenir le texte de certaines QComboBoxes chaque fois que lignes sont ajoutés? Pour info, la fonction clearcases est connectée au bouton Clear Case, donc chaque fois que je clique sur le bouton, je veux imprimer le 1er texte (Case A) Lift0 vers la console.

exemple Exécution:

https://drive.google.com/drive/folders/0BzcHlfStubD3cHpUTkttN3h4NDA?usp=sharing

Répondre

1

Le problème est principalement causée par la déclaration suivante:

for x in range(1, 33): 

Le code précédent implique que les codes comme le LiftBox[i] = QtWidgets.QComboBox() suivant est exécuté à plusieurs reprises et par conséquent la variable est effacé de la mémoire, en obtenant le message d'erreur que vous mentionnez.

Une autre mauvaise pratique de programmation est de remplir les variables globales au sein d'une classe, il est préférable de faire ces variables attributs de classe.

Enfin, pour avoir un bon ordre est préférable de ne pas modifier le code généré par Qt Designer, la meilleure chose est de créer une classe qui gère la logique et d'utiliser la conception de Qt Designer comme indiqué ci-dessous:

class MainWindow(QMainWindow, Ui_MainWindow): 
    def __init__(self, parent=None): 
     QMainWindow.__init__(self, parent) 
     self.setupUi(self) 

     self.pushButton.clicked.connect(self.addcases) 
     self.pushButton_2.clicked.connect(self.clearcases) 

     self.TotalLift = [] 
     self.LiftBox = {} 
     self.TotalReed = [] 
     self.ReedBox = {} 

    def addcases(self): 
     row = self.tableWidget.rowCount() 
     self.tableWidget.insertRow(row) 
     self.tableWidget.setVerticalHeaderItem(row, QTableWidgetItem('Case ' + chr(ord('A') + row))) 

     Lift = ['', 'N', 'M', 'H'] 
     Reed = ['', 'B', 'C', 'D', 'E', 'O', 'P'] 

     for i in range(4): 
      self.LiftBox[i] = QtWidgets.QComboBox(self) 
      self.LiftBox[i].addItems(Lift) 
      self.TotalLift.append(self.LiftBox[i]) 
      self.ReedBox[i] = QtWidgets.QComboBox(self) 
      self.ReedBox[i].addItems(Reed) 
      self.tableWidget.setCellWidget(row, 2*i +2, self.ReedBox[i]) 
      self.tableWidget.setCellWidget(row, 2*i +3, self.LiftBox[i]) 

    def clearcases(self): 
     print(self.TotalLift[0].currentText())