在 QTableWidget PyQT 中获取复选框 cellWidget 的状态
Get state of checkbox cellWidget in QTableWidget PyQT
我正在为 QGIS 开发 python 插件。在这个插件中,我创建了一个包含 3 列的 QTableWidget。这些列是 QCheckbox、QTableWidgetItem 和 QComboBox。我想检索这 3 列中包含的值。目前我设法获得了 QComboBox 和 QTableWidgetItem 的值,但我似乎无法获得 QCheckBox 的值。
liste = ['Carte 1','Carte 2','Carte 3','Carte 4','Carte 5','Carte 6']
combo_box_options = ["A4 Paysage","A4 Portrait", "A3 Paysage","A3 Portrait"]
self.dlg_format = Dialog_format()
self.dlg_format.tableWidget.setRowCount(len(liste))
for index in range(len(liste)):
item = QTableWidgetItem(liste[index])
self.dlg_format.tableWidget.setItem(index, 1, item)
self.dlg_format.tableWidget.setColumnWidth(0, 20)
self.dlg_format.tableWidget.setColumnWidth(1, 350)
combo = QComboBox()
for t in combo_box_options:
combo.addItem(t)
self.dlg_format.tableWidget.setCellWidget(index, 2, combo)
widget = QWidget()
checkbox = QCheckBox()
checkbox.setCheckState(Qt.Checked)
playout = QHBoxLayout(widget)
playout.addWidget(checkbox)
playout.setAlignment(Qt.AlignCenter)
playout.setContentsMargins(0,0,0,0)
widget.setLayout(playout)
self.dlg_format.tableWidget.setCellWidget(index, 0, widget)
self.dlg_format.show()
result = self.dlg_format.exec_()
if result:
for index in range(len(liste)):
text = self.dlg_format.tableWidget.item(index, 1).text()
format = self.dlg_format.tableWidget.cellWidget(index, 2).currentText()
check = self.dlg_format.tableWidget.cellWidget(index, 0).checkState() #Does not work
QWidget 是设置为单元格小部件,而不是复选框,而且该小部件显然没有 checkState
属性。
这种情况有多种可能性。
使复选框成为小部件的属性:
小部件 = QWidget()
widget.checkbox = QCheckBox()
playout.addWidget(widget.checkbox)
# ...
check = self.dlg_format.tableWidget.cellWidget(index, 0).<b>复选框</b>.checkState()
使复选框的 checkState
函数成为小部件的引用(注意:没有括号!)以便您可以使用现有的 cellWidget(index, 0).checkState()
:
访问它
checkbox = QCheckBox()
widget.checkState = checkbox.checkState
由于所有发生在同一范围内(函数),您可以完全忽略 cellWidget
并使用包含小部件的元组列表:
widgets = []
for index in range(len(liste)):
# ...
widgets.append((item, combo, checkbox))
# ...
if result:
for item, combo, checkbox in widgets:
text = item.text()
format = combo.currentText()
check = checkbox.checkState()
注意:
checkState()
returns一个Qt.CheckState
enum, which results in 2 (Qt.Checked
) for a checked box; if you need a boolean, use isChecked()
代替;
- 您可以使用
enumerate
而不是 range
,因为无论如何您都在遍历列表项:for index, text in enumerate(liste):
;
- 如果你不需要添加项目数据并且组合的内容总是相同的,只需使用
combo.addItems(combo_box_options)
;
- 为每个循环设置列宽没有意义,只需在
for
循环之外设置一次即可;
- 如果您使用
QHBoxLayout(widget)
,则不需要 widget.setLayout(playout)
,因为布局上的小部件参数已经在小部件上设置了该布局;
- 创建实例属性是为了使它们持久化(它确保它们不会被垃圾收集并允许将来访问);从你的代码来看,你似乎不太可能在函数returns之后使用那个对话框实例,所以让它成为实例的成员(
self.dlg_format
)是不需要的,并且会不必要地占用资源:即使对话框关闭后,它也会保留在内存中,一旦再次创建,它就会被删除和覆盖;只需将其设为局部变量 (dlg_format = Dialog_format()
);
我正在为 QGIS 开发 python 插件。在这个插件中,我创建了一个包含 3 列的 QTableWidget。这些列是 QCheckbox、QTableWidgetItem 和 QComboBox。我想检索这 3 列中包含的值。目前我设法获得了 QComboBox 和 QTableWidgetItem 的值,但我似乎无法获得 QCheckBox 的值。
liste = ['Carte 1','Carte 2','Carte 3','Carte 4','Carte 5','Carte 6']
combo_box_options = ["A4 Paysage","A4 Portrait", "A3 Paysage","A3 Portrait"]
self.dlg_format = Dialog_format()
self.dlg_format.tableWidget.setRowCount(len(liste))
for index in range(len(liste)):
item = QTableWidgetItem(liste[index])
self.dlg_format.tableWidget.setItem(index, 1, item)
self.dlg_format.tableWidget.setColumnWidth(0, 20)
self.dlg_format.tableWidget.setColumnWidth(1, 350)
combo = QComboBox()
for t in combo_box_options:
combo.addItem(t)
self.dlg_format.tableWidget.setCellWidget(index, 2, combo)
widget = QWidget()
checkbox = QCheckBox()
checkbox.setCheckState(Qt.Checked)
playout = QHBoxLayout(widget)
playout.addWidget(checkbox)
playout.setAlignment(Qt.AlignCenter)
playout.setContentsMargins(0,0,0,0)
widget.setLayout(playout)
self.dlg_format.tableWidget.setCellWidget(index, 0, widget)
self.dlg_format.show()
result = self.dlg_format.exec_()
if result:
for index in range(len(liste)):
text = self.dlg_format.tableWidget.item(index, 1).text()
format = self.dlg_format.tableWidget.cellWidget(index, 2).currentText()
check = self.dlg_format.tableWidget.cellWidget(index, 0).checkState() #Does not work
QWidget 是设置为单元格小部件,而不是复选框,而且该小部件显然没有 checkState
属性。
这种情况有多种可能性。
使复选框成为小部件的属性:
小部件 = QWidget()
widget.checkbox = QCheckBox()
playout.addWidget(widget.checkbox)
# ...
check = self.dlg_format.tableWidget.cellWidget(index, 0).<b>复选框</b>.checkState()
使复选框的 checkState
函数成为小部件的引用(注意:没有括号!)以便您可以使用现有的 cellWidget(index, 0).checkState()
:
checkbox = QCheckBox()
widget.checkState = checkbox.checkState
由于所有发生在同一范围内(函数),您可以完全忽略 cellWidget
并使用包含小部件的元组列表:
widgets = []
for index in range(len(liste)):
# ...
widgets.append((item, combo, checkbox))
# ...
if result:
for item, combo, checkbox in widgets:
text = item.text()
format = combo.currentText()
check = checkbox.checkState()
注意:
checkState()
returns一个Qt.CheckState
enum, which results in 2 (Qt.Checked
) for a checked box; if you need a boolean, useisChecked()
代替;- 您可以使用
enumerate
而不是range
,因为无论如何您都在遍历列表项:for index, text in enumerate(liste):
; - 如果你不需要添加项目数据并且组合的内容总是相同的,只需使用
combo.addItems(combo_box_options)
; - 为每个循环设置列宽没有意义,只需在
for
循环之外设置一次即可; - 如果您使用
QHBoxLayout(widget)
,则不需要widget.setLayout(playout)
,因为布局上的小部件参数已经在小部件上设置了该布局; - 创建实例属性是为了使它们持久化(它确保它们不会被垃圾收集并允许将来访问);从你的代码来看,你似乎不太可能在函数returns之后使用那个对话框实例,所以让它成为实例的成员(
self.dlg_format
)是不需要的,并且会不必要地占用资源:即使对话框关闭后,它也会保留在内存中,一旦再次创建,它就会被删除和覆盖;只需将其设为局部变量 (dlg_format = Dialog_format()
);