1

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

4

1 回答 1

1

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):
  • 如果您不需要添加项目数据并且组合的内容始终相同,只需使用combo.addItems(combo_box_options);
  • 为每个循环设置列宽是没有意义的,只需在for循环外执行一次即可;
  • 如果您使用QHBoxLayout(widget),则不需要widget.setLayout(playout),因为布局上的小部件参数已经在小部件上设置了该布局;
  • 创建实例属性是为了使它们持久化(它确保它们不会被垃圾收集并允许将来访问);从您的代码来看,您似乎不太可能在该函数返回self.dlg_format使用该对话框实例,因此不需要将其设为实例 ( ) 的成员,并且会占用不必要的资源:即使在关闭对话框后,对话框也会保留在内存中, 然后一旦再次创建就会被删除和覆盖; 只需将其设为局部变量 ( dlg_format = Dialog_format());
于 2021-04-27T12:15:45.147 回答