纳速健身

标题: [pyqt5] 奇怪的QTableWidget行为 – 排序后表格内容不再填充所有单元格或者只填充最后一行解决办法 [打印本页]

作者: awagink    时间: 2021-1-14 09:09
标题: [pyqt5] 奇怪的QTableWidget行为 – 排序后表格内容不再填充所有单元格或者只填充最后一行解决办法


原文   https://stackoverflow.com/questions/7960505/strange-qtablewidget-behavior-not-all-cells-populated-after-sorting-followed-b
我有一个QTableWidget,我填充如下:
  1. // Clear the table
  2.   this->topPatchesTableWidget->setRowCount(0);

  3.   this->topPatchesTableWidget->setRowCount(numberToDisplay);
  4.   for(unsigned int pairId = 0; pairId < numberToDisplay; ++pairId)
  5.     {
  6.     // Display patch match scores
  7.     QTableWidgetItem* myLabel = new QTableWidgetItem;
  8.     myLabel->setData(Qt:<img src="https://static.nasue.com/static/image/smiley/default/biggrin.gif" border="0" smilieid="3" alt=":D">isplayRole, myValues[pairId]);
  9.     this->tableWidget->setItem(pairId, 0, myLabel);
  10.     ... fill other columns ...
  11.     }
复制代码

(我有一些其他UI元素来设置计算myValues中值的属性).如果我更改属性,重新计算并重新创建表,一切都按预期工作.如果我通过单击其中一个标题对表进行排序,则会对其进行正确排序.但是,如果此时(排序后)我再次单击我的按钮重新计算值并重新创建表格,表格非常破碎.也就是说,许多单元格是空的,而非空单元格似乎没有任何特定的顺序.

通过添加手动调用

  1. this->tableWidget->sortByColumn(0, Qt::AscendingOrder);
复制代码

在我的CreateTable函数的开头,一切都按预期工作,但当然新创建的表按列0排序,而不是为最后一次排序选择的列.

有没有人知道为什么没有调用sortByColumn就会出错? (我试图做一个简单的例子,但我无法在演示程序中复制问题).

谢谢,

大卫

我在python中遇到了类似的问题,如果选择了列标题以便在该列停止填充后启用对单元格进行排序.
我通过在行add方法的开头设置self.tableWidget.setSortingEnabled(False),然后在行add方法的末尾将其设置回self.tableWidget.setSortingEnabled(True)来解决它.根据riverbank computing,这是正式推荐的解决此问题的方法.
QTableWidget.setItem (self, int row, int column, QTableWidgetItem item)

Note that if sorting is enabled (see sortingEnabled) and column is the current sort column, the row will be moved to the sorted position determined by item.

If you want to set several items of a particular row (say, by calling setItem() in a loop), you may want to turn off sorting before doing so, and turn it back on afterwards; this will allow you to use the same row argument for all items in the same row (i.e. setItem() will not move the row).
See also item() and takeItem().







欢迎光临 纳速健身 (https://www.nasue.com/) Powered by Discuz! X3.4