【问题标题】:QTableWidget dynamic rows w/ QComboBox带 QComboBox 的 QTableWidget 动态行
【发布时间】:2018-02-15 04:33:56
【问题描述】:

我有一个我正在处理的 QTableWidget,当用户点击一个名为“添加案例”的按钮时,它应该在某些单元格上使用组合框动态添加行。我的主要部分工作正常,但我遇到的问题是试图从组合框中获取文本。在下面的代码中,我有一个名为 def clearcases() 的函数作为用于测试的虚拟函数。我知道每当我添加一行时,前面的行引用都会被删除,这就是我无法访问它们的原因,所以我尝试创建一个列表来跟踪所有组合框对象。

当前代码出现此错误

错误:

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

我的总体问题是,如何在添加行时从某些 QComboBoxes 中获取文本?

仅供参考,clearcases 功能已连接到 Clear Case 按钮​​,因此每当我单击该按钮时,我希望它能够将第一行 (Case A) Lift0 文本打印到控制台。

运行示例:

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

【问题讨论】:

    标签: python python-3.x pyqt pyqt5 qtablewidget


    【解决方案1】:

    问题主要是由以下语句引起的:

    for x in range(1, 33):
    

    前面的代码需要重复执行类似下面的代码LiftBox[i] = QtWidgets.QComboBox(),因此变量正在从内存中擦除,得到你提到的错误消息。

    另一个不好的编程习惯是在一个类中填充全局变量,最好让这些变量成为类属性。

    最后要有一个正确的顺序最好不要修改Qt Designer生成的代码,聪明的是创建一个处理逻辑的类并使用Qt Designer的设计如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      相关资源
      最近更新 更多