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