QTableWidget 动态行 w/ QComboBox
QTableWidget dynamic rows w/ QComboBox
我有一个正在使用的 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 按钮,所以每当我单击该按钮时,我希望它打印第一行(案例 A)Lift0 文本到控制台。
运行 示例:
https://drive.google.com/drive/folders/0BzcHlfStubD3cHpUTkttN3h4NDA?usp=sharing
问题主要是由以下语句引起的:
for x in range(1, 33):
前面的代码需要重复执行如下代码LiftBox[i] = QtWidgets.QComboBox()
,因此从内存中删除变量,得到您提到的错误消息。
另一个不好的编程习惯是在class内填充全局变量,最好让那些变量有class属性。
最后,要有一个正确的顺序最好不要修改 Qt Designer 生成的代码,聪明的做法是创建一个 class 来处理逻辑并使用 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())
我有一个正在使用的 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())
仅供参考,clearcases 函数连接到 Clear Case 按钮,所以每当我单击该按钮时,我希望它打印第一行(案例 A)Lift0 文本到控制台。
运行 示例:
https://drive.google.com/drive/folders/0BzcHlfStubD3cHpUTkttN3h4NDA?usp=sharing
问题主要是由以下语句引起的:
for x in range(1, 33):
前面的代码需要重复执行如下代码LiftBox[i] = QtWidgets.QComboBox()
,因此从内存中删除变量,得到您提到的错误消息。
另一个不好的编程习惯是在class内填充全局变量,最好让那些变量有class属性。
最后,要有一个正确的顺序最好不要修改 Qt Designer 生成的代码,聪明的做法是创建一个 class 来处理逻辑并使用 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())