【问题标题】:Get state of checkbox cellWidget in QTableWidget PyQT在 QTableWidget PyQT 中获取复选框 cellWidget 的状态
【发布时间】:2021-04-27 09:52:16
【问题描述】:

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

【问题讨论】:

  • 您不是将 QCheckBox 添加为单元格小部件,而是包含它的 QWidget(显然没有 checkState() 属性。是否需要父 QWidget?
  • 是的,此父项是必需的,因为它允许对齐单元格中心的复选框

标签: python qt pyqt qtablewidget qcheckbox


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

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多