Странное поведение QTableWidget - не все ячейки, заполненные после сортировки с последующим повторным заполнением - PullRequest
8 голосов
/ 01 ноября 2011

У меня есть QTableWidget, который я заполняю следующим образом:

  // Clear the table
  this->topPatchesTableWidget->setRowCount(0);

  this->topPatchesTableWidget->setRowCount(numberToDisplay);
  for(unsigned int pairId = 0; pairId < numberToDisplay; ++pairId)
    {
    // Display patch match scores
    QTableWidgetItem* myLabel = new QTableWidgetItem;
    myLabel->setData(Qt::DisplayRole, myValues[pairId]);
    this->tableWidget->setItem(pairId, 0, myLabel);
    ... fill other columns ...
    }

(у меня есть некоторые другие элементы пользовательского интерфейса для установки свойств, которые вычисляют значения в myValues).Если я изменю свойства, заново вычислю и заново создаю таблицу, все будет работать как положено.Если я сортирую таблицу, нажимая на один из заголовков, она сортируется правильно.ОДНАКО, если в этот момент (после сортировки) я снова нажму кнопку, чтобы пересчитать значения и пересоздать таблицу, таблица будет очень разбита.То есть многие из ячеек пусты, а ячеи, которые не являются пустыми, по-видимому, не в каком-либо конкретном порядке.

При добавлении ручного вызова к

this->tableWidget->sortByColumn(0, Qt::AscendingOrder);

вВ начале моей функции CreateTable все работает, как и ожидалось, но, конечно, вновь созданная таблица сортируется по столбцу 0, а не по столбцу, который был выбран для последней сортировки.

Кто-нибудь знает, почему все будетпойти так не так без вызова sortByColumn?(Я попытался сделать простой пример, но я не могу воспроизвести проблему в демонстрационной программе).

Спасибо,

Дэвид

Ответы [ 4 ]

14 голосов
/ 18 января 2012

У меня была похожая проблема в python, если был выбран заголовок столбца, чтобы включить сортировку ячеек после того, как этот столбец перестал заполняться.

Я справился с этим, установив self.tableWidget.setSortingEnabled (False) в начале метода добавления строки, а затем установив обратно значение self.tableWidget.setSortingEnabled (True) в конце метода добавления строки. Согласно данным riverbank это официально рекомендуемый способ решения этой проблемы.

QTableWidget.setItem (self, int row, int column, элемент QTableWidgetItem)

Обратите внимание, что если сортировка включена (см. SortingEnabled) и столбец является текущим столбцом сортировки, строка будет перемещена в положение сортировки, определенное элементом.

Если вы хотите установить несколько элементов определенной строки (скажем, путем вызова setItem () в цикле), вы можете отключить сортировку, прежде чем делать это, а затем включить ее снова; это позволит вам использовать один и тот же аргумент строки для всех элементов в одной строке (т.е. setItem () не будет перемещать строку).

См. Также item () и takeItem ().

1 голос
/ 16 июля 2015

Это уточнение ответа Карнисова, также с PyQt. Отключение сортировки перед выполнением каких-либо setItem() сработало для меня, но это привело к потере выбора сортировки пользователя, поэтому я сделал это так, где t - это QTableWidget:

oldSort = t.horizontalHeader().sortIndicatorSection()
oldOrder = t.horizontalHeader().sortIndicatorOrder()
t.setSortingEnabled(False)

# make the changes

t.sortItems(oldSort, oldOrder)
t.setSortingEnabled(True)

Обратите внимание, что сортировка по-прежнему может немного измениться с помощью этого кода. Похоже, это происходит потому, что сортировка, которую использует здесь Qt, не перемещает элементы, которые уже были в порядке, поэтому, если бы у нас была такая таблица:

NUMBER    LETTER    OTHER LETTER
     1         B               C
     2         G               Q
     3         A               Q

Если мы отсортируем по номеру, то по другому письму ничего не изменится. Но если мы сортируем по ПИСЬМУ, то по ДРУГОЙ ПИСЬМО мы получаем:

NUMBER    LETTER    OTHER LETTER
     1         B               C
     3         A               Q
     2         G               Q

Так что, если бы мы ранее сортировали по LETTER, то по OTHER LETTER, этот код выполнял бы только одну сортировку по OTHER LETTER, и мы в итоге получили бы вторую версию таблицы вместо первой (при условии, что порядок элементы были добавлены в таблицу в совпадениях (NUMBER). В этом месте в моем коде все элементы удаляются и повторно добавляются для обновления таблицы, поэтому иногда это может привести к заметным изменениям в порядке.

1 голос
/ 22 марта 2012

У меня была та же проблема - всегда, когда я хотел вставить новые данные, я строил заголовок и setSortingEnabled(true).Я думаю, QTableWidget не любит несколько вызовов для setSortingEnabled(true).Поэтому я поместил его в конструктор моего MainWindown, и вот оно!

0 голосов
/ 16 ноября 2011

Я так и не понял, что с этим не так.Я отказался и реализовал собственную модель / представление, которая, вероятно, в любом случае является гораздо лучшей идеей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...