尝试在 QTableWidget 中设置重叠时出现错误

I get error when try to set overlap in QTableWidget

我有一个 table 有 4 rows.First 2 行,必须跨越第 0 列,最后 2 行,也必须跨越第 0 列。 这是我使用的一段代码,但在第二个跨度时我得到

QTableView :: setSpan: span cannot overlap

    table.setRowCount(0)
    new_row = 0
    table.insertRow(new_row)
    table.setRowHeight(new_row, 20)
    table.setSpan(0, 0, 2, 1)     ### <------
    cell = QTableWidgetItem(str('AA'))
    table.setItem(new_row, 0, cell)
    a = 1
    while a <= 10:
        cell = QTableWidgetItem(str(a))
        table.setItem(new_row, a, cell)
        a += 1
    new_row += 1
    table.insertRow(new_row)
    table.setRowHeight(new_row, 20)
    
    a = 1
    while a <= 10:
        
        cell = QTableWidgetItem(str('CC'))
        table.setItem(new_row, a, cell)
        a += 1
    new_row += 1
    table.insertRow(new_row)
    table.setRowHeight(new_row, 20)
    table.setSpan(2, 0, 2, 1)     ### <------
    cell = QTableWidgetItem(str('BB'))
    table.setItem(new_row, 0, cell)

问题是您正在插入一行之前设置的范围内。跨度是动态的,而不是固定的:如果您在包含跨度的单元格之间插入元素,则它们的跨度会扩大。

如果模型已经有 2 行,设置 2 行跨度将使第一行跨度到第二行。现在,考虑一下:如果您 在第一行和第二行之间插入 一行会发生什么?您会期望跨越应该 扩展 以包括所有三行,不是吗?

当您创建第一行并设置第一个跨度时,虽然只有一行,但内部“跨度集合”仍会保留该引用。当您在索引 1(即 0 和 1 之间)处插入一行时,范围会如前所述扩展:包括行 0 到 2,即前三行。即使仍然只有两行也是如此。

然后,错误来自于您最终添加了第三行(包含在上面的跨度中),并且当您尝试设置第二个跨度时,它不起作用,因为它会与前一个重叠,因为您希望它从第三行开始。

解决方案很简单:只有在行或列存在时才设置跨度,而不是之前。

在您的情况下,将第一行 setSpan() 移动到 添加第二行之后。因此,只有当实际添加了“跨越”行时,您才应该对第二个 setSpan() 执行相同的操作(就像现在一样,您犯了同样的错误)。