获取qtablewidget pyqt中checkbox cellwidget的状态

tjrkku2a  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(780)

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

8ljdwjyq1#

qwidget被设置为cell widget,而不是checkbox,而且这个widget显然没有 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() );

相关问题