在 QTableWidget PyQT

时间:2021-04-27 09:52:16

标签: python qt pyqt qtablewidget qcheckbox

我为 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

1 个答案:

答案 0 :(得分:0)

QWidget 被设置为单元格小部件,而不是复选框,而且该小部件显然没有 checkState 属性。

这种情况有多种可能性。

使复选框成为小部件的属性:

    widget = QWidget()
    widget.checkbox = QCheckBox()
    playout.addWidget(widget.checkbox)

    # ...
    check = self.dlg_format.tableWidget.cellWidget(index, 0).checkbox.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() 返回一个 Qt.CheckState 枚举,对于选中的框,结果为 2 (Qt.Checked);如果您需要布尔值,请改用 isChecked()
  • 您可以使用 enumerate 代替 range,因为您无论如何都要遍历列表项:for index, text in enumerate(liste):;
  • 如果你不需要添加item数据并且combo的内容总是一样的,就用combo.addItems(combo_box_options);
  • 为每个循环设置列宽毫无意义,只需在 for 循环外设置一次;
  • 如果您使用 QHBoxLayout(widget),则不需要 widget.setLayout(playout),因为布局上的小部件参数已经在小部件上设置了该布局;
  • 实例属性的创建是为了使它们持久化(它确保它们不会被垃圾收集并允许将来访问);从您的代码来看,您似乎不太可能在该函数返回之后使用该对话框实例 ,因此不需要使其成为实例的成员 (self.dlg_format) 并保持不必要的资源占用:对话框即使在关闭后仍会保留在内存中,然后在再次创建后立即删除和覆盖;只需将其设为局部变量 (dlg_format = Dialog_format());