不能在 QTableWidget 中添加两列。错误 - DeprecationWarning:需要一个整数(获取类型浮点数)

Posted

技术标签:

【中文标题】不能在 QTableWidget 中添加两列。错误 - DeprecationWarning:需要一个整数(获取类型浮点数)【英文标题】:Can't add two columns in QTableWidget. Error - DeprecationWarning: an integer is required (got type float) 【发布时间】:2021-07-13 11:30:29 【问题描述】:

我正在尝试使用 PyQt5 中的 QTableWidget 创建一个电子表格。我想将两列的值相加并在第三列中显示结果。但我不断收到错误DeprecationWarning: an integer is required (got type float). Implicit conversion to integers using __int__ is deprecated, and may be removed in a future version of Python.

这是我为添加列而编写的函数。

def add_columns(self):
        new_cols = self.tableWidget.columnCount()
        for self.row in range (self.tableWidget.rowCount()):
            add_2_cols = float((self.tableWidget.item(self.row, 0)).text()) + float((self.tableWidget.item(self.row, 1)).text())
            add_2_cols = QTableWidgetItem(add_2_cols)
            self.tableWidget.setItem(self.row, 3, add_2_cols)

或者,如果有一个预设功能来做到这一点,那就太好了,但我找不到。

【问题讨论】:

【参考方案1】:

这是因为您尝试使用总和的结果(即浮点数)作为第一个参数来创建 QTableWidgetItem。

QTableWidgetItem 的One of the constructors 接受一个整数。 来自文档的"Subclassing" section

当子类化 QTableWidgetItem 以提供自定义项时,可以为它们定义新类型,以便将它们与标准项区分开来。需要此功能的子类的构造函数需要调用基类构造函数,其新类型值等于或大于UserType

因此,不仅您提供了无效类型(因为它应该是整数),而且您出于错误的原因使用它。

如果要创建一个以结果为文本的项目,则必须将其转换为字符串:

add_2_cols = QTableWidgetItem(str(add_2_cols))

或者,您可以创建一个“空”项目并使用setData() 设置其显示值,同时以数字形式存储它:

add_2_cols = QTableWidgetItem()
add_2_cols.setData(QtCore.Qt.DisplayRole, add_2_cols)

这仍然会让text() 处理该项目,但好处是您可以使用data() 获得正确的数值,而不会冒任何转换的风险:

item = self.tableWidget.item(row, column)
if item:
    value = item.data(QtCore.Qt.DisplayRole)

另外,请考虑在 for 循环中设置实例属性(就像您对 self.row 所做的那样):首先,如果使用不当,可能会导致意外行为,错误和崩溃;而且,由于每次迭代都会覆盖先前的引用,因此拥有一个“静态”引用完全没有意义。

【讨论】:

谢谢,您的解决方案有效。我想知道,有没有一种方法可以将两列作为一堆选择并将它们添加在一起而不使用循环,因为我认为这样会更整洁。 @E.Artemis 不客气!关于您的问题,您只考虑 您的 用户案例:就像您的一样,还有其他数千个任何人都可以说“如果...可能有用”。这不是 QTableWidget 的目的,它是一个表模型的高级接口,可以包含任何类型的数据。支持这样的功能意味着支持其他数千个与您一样“相当有用”的功能,从而使课程变得不必要地复杂并且无限容易出现错误和问题。

以上是关于不能在 QTableWidget 中添加两列。错误 - DeprecationWarning:需要一个整数(获取类型浮点数)的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在 QTableWidget 的一列中添加一行?

Qt 杂记——QTableWidget列表添加删除(备份)

Qt 添加表格小部件项目的问题

如何防止用户使用 Python 和 Qt 在 QtableWidget 中移动列的大小?

Qt QTableWidget 列调整大小

Qt与Qtablewidget中headeritem的Python大小