python - QTableWidget 动态行 w/QComboBox

标签 python python-3.x pyqt pyqt5 qtablewidget

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

我在当前代码中遇到此错误

错误:

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 我的总体问题是,每当添加行时如何从某些 QComboBox 获取文本?

仅供引用,clearcases 函数连接到 Clear Case 按钮​​,因此每当我单击该按钮时,我希望它将第一行(案例 A)Lift0 文本打印到控制台。

运行示例:

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

最佳答案

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

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

关于python - QTableWidget 动态行 w/QComboBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46079378/

相关文章:

python - 属性错误: 'Client' object has no attribute 'send_message' (DiscordBot python)

python - pip install --no-build-isolation 返回没有这样的选项 : --no-build-isolation

python - 如何使用 pytest fixtures 和 django 在 unittest 中创建类似于 "setUp"的方法

python - 狮身人面像 Qt ValueError : API 'QDate' has already been set to version 1

python - python中部分函数的参数

python - 如何在没有队列的情况下更改多处理中的类值?

python - 优化 Python Dictionary 中的交集过程

python-3.x - 如何在 Visual Studio Code 中使用 activate.bat 而不是 ps1 运行选定文本?

python - 在python中更新字典

pyqt - 关闭时崩溃并退出