2017-09-06 15 views
0

私は、ユーザーがAdd Casesというボタンを押すたびに、特定のセルにコンボボックスを動的に追加するはずのQTableWidgetを持っています。私は主要な部分が働いているが、私が持っている問題は、コンボボックスからテキストを取得しようとしている。次のコードでは、テスト用のダミー関数としてdef clearcases()という関数があります。私は行を追加するたびに前の行の参照が削除されることを理解しています。そのためアクセスできないため、すべてのコンボボックスオブジェクトを追跡するリストを作成しようとしました。QTableWidget動的行付きQComboBox

は、私は現在のコードでこのエラーを取得しています

エラー:

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 私の全体的な質問は、私は特定のQComboBoxesたびの行からテキストを得るのですか追加されますか?

FYIでは、clearcases関数はClear Caseボタンに接続されているので、ボタンをクリックするたびに、最初の行(Case A)のLift0テキストをコンソールに出力します。

実行例:

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

答えて

1

問題は主に以下のステートメントによって引き起こされる:

前のコードは、次のような LiftBox[i] = QtWidgets.QComboBox()コードを繰り返し、従って変数実行されることを伴う
for x in range(1, 33): 

メモリから消去されています。エラーメッセージが表示されます。

もう1つの悪いプログラミング方法は、クラス内のグローバル変数を埋めることです。これらの変数をクラス属性にすることが最善です。最後に、適切な順序を持っている

は、スマートなものはロジックを処理するクラスを作成し、以下に示すようにQtのデザイナーのデザインを使用することで、Qtのデザイナーによって生成されたコードを変更しない方がよい:

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()) 
関連する問題