2017-09-06 3 views
0

Ich habe ein QTableWidget, das ich arbeite, das Zeilen dynamisch mit Comboboxen auf bestimmten Zellen hinzufügen soll, wenn der Benutzer eine Schaltfläche mit dem Namen Add Cases trifft. Ich habe die wichtigsten Teile funktioniert, aber das Problem, das ich habe, versucht, den Text aus der Combobox zu bekommen. Im folgenden Code habe ich eine Funktion namens def clearcases() als Dummy-Funktion zum Testen. Ich verstehe, dass, wenn ich eine Zeile hinzufüge, die Referenzen der vorherigen Zeilen gelöscht werden, weshalb ich nicht darauf zugreifen kann, also habe ich versucht, eine Liste zu erstellen, die alle Combobox-Objekte verfolgt.QTableWidget dynamische Zeilen w/QComboBox

Ich erhalte diesen Fehler mit dem aktuellen Code

Fehler:

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 Mein Gesamt Frage ist, wie bekomme ich den Text aus bestimmten QComboBoxes, wenn Reihen sind hinzugefügt?

FYI, die Clearcases-Funktion ist mit der Schaltfläche "Clear Case" verbunden. Wenn ich also auf die Schaltfläche klicke, möchte ich, dass der erste Zeile (Case A) Lift0-Text an die Konsole gedruckt wird.

Lauf Beispiel:

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

Antwort

1

Das Problem hauptsächlich durch die folgende Anweisung verursacht:

for x in range(1, 33): 

Der vorherige Code führt dazu, dass Codes wie folgt LiftBox[i] = QtWidgets.QComboBox() wiederholt ausgeführt wird und daher die Variable wird aus dem Speicher gelöscht, die Fehlermeldung erhalten, die Sie erwähnen.

Eine andere schlechte Programmierpraxis ist es, globale Variablen innerhalb einer Klasse zu füllen, ist es am besten, diese Variablen Klassenattribute zu machen.

Endlich eine richtige Reihenfolge ist besser, nicht den Code generiert von Qt Designer, die intelligente, was zu ändern ist, eine Klasse zu erstellen, die die Logik behandelt und das Design von Qt Designer zu verwenden, wie unten dargestellt:

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