尝试在 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()
执行相同的操作(就像现在一样,您犯了同样的错误)。
我有一个 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()
执行相同的操作(就像现在一样,您犯了同样的错误)。