Qt4 - Как добавить строку в QTableWidget, когда сортировка включена?

У меня есть QTableWidget, с помощью которого я могу добавлять строки, нажимая кнопку. Проблема в том, что у меня _table->setSortingEnabled(true);, и когда я вставлю новую строку, я не узнаю, где она. Поскольку, поскольку я установил сортировку таблицы, когда я добавляю строку, эта строка переместится в ее позицию (в зависимости от того, какой столбец сортируется). Как мне тогда узнать, какой именно?

Пример с одним столбцом (Имя), отсортированным в алфавитном порядке:

Name |
------
abc
toto
zozo

Если я сейчас добавлю строку вроде следующей:

int newRow = _table->rowCount();

_table->insertRow(newRow);

QTableWidgetItem *item1 = new QTableWidgetItem;
item1->setText("boom");
_table->setItem(newRow, 0, item1);

Строка будет находиться между «abc» и «toto».

Name |
------
abc
     <<< boom
toto
zozo

Здесь он будет работать правильно, но у меня несколько столбцов, и если сейчас я попробую, например:

QTableWidgetItem *item2 = new QTableWidgetItem;
item1->setText("45");
_table->setItem(newRow, 1, item2);

Значение, которое изменится, - это значение второго столбца «zozo», а не то, которое мне нужно, «бум».

Я попытался на примере объяснить проблему, надеюсь, помогло. Итак, как я могу добавить новую строку, установить ее текст для каждого столбца, если у меня включена сортировка на моем QTableWidget?

Редактировать: ответ от невзрывоопасного (в комментариях):

Для второго QWidgetItem просто нужно проделать то же самое:

QTableWidgetItem *item2 = new QTableWidgetItem;
item1->setText("45");
_table->setItem(item1->row(), 1, item2); // change newRow by item1->row()

person Elfayer    schedule 09.08.2013    source источник
comment
Посмотрите в QTableWidgetItem::row(), чтобы получить строку из item1   -  person Nafis Zaman    schedule 09.08.2013
comment
для этого может быть проще использовать модель / представление, но почему бы не вставить строку только в конце и не отсортировать ее по последнему столбцу, в котором она была отсортирована?   -  person Zaiborg    schedule 21.08.2013


Ответы (3)


Возможно, вам потребуется отключить сортировку с помощью setSortingEnabled (false) перед вставкой и повторно включить ее после завершения.

person jayatubi    schedule 09.03.2015

Создайте скрытый столбец, который будет содержать идентификатор каждой строки, поэтому при добавлении строки просто используйте void QTableWidget scrollToItem (const QTableWidgetItem *item , QAbstractItemView::ScrollHint hint=EnsureVisible ) для прокрутки таблицы к этой строке.

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

Если у вас есть идентификатор строки, вы также можете изменить цвет новой строки (ячейка за ячейкой) с помощью void QTableWidgetItem::setBackground ( const QBrush & brush ), пока не будет добавлена ​​следующая новая строка.

Выполнение обоих этих предложений гарантирует, что новая добавленная строка будет вам видна.

person Aleksandar    schedule 27.08.2013

Сначала вам нужно вставить новую строку, используя rowCount

int row = table->rowCount();
table->insertRow(row);

Затем для первого QTableWidgetItem вам нужно позвонить QTableWidget::setItem(row, item) с помощью rowCount

table->setItem(row, item);

Для последующих QTableWidgetItems используется QTableWidgetItem::row() из первого QTableWidgetItem, который мог быть перемещен из-за сортировки

table->setItem(first_item->row, item);

Вот пример вызова QTableWidget::setItem(row, item) из цикла, где вы используете row, когда index == 0 и item[0], когда index != 0:

void App::onAddRow()
{
    std::vector<QTableWidgetItem*> items;

    items.push_back(new QTableWidgetItem("foo"));
    items.push_back(new QTableWidgetItem("bar"));
    items.push_back(new QTableWidgetItem("baz"));
    items.push_back(new QTableWidgetItem("bang"));

    int row = table->rowCount();
    table->insertRow(row);

    for (size_t i = 0; i < items.size(); ++i)
    {
        table->setItem(i == 0 ? row : items[0]->row(), i, items[i]);
    }
}
person Steve Lorimer    schedule 23.03.2016
comment
Это будет работать, только если вы сортируете таблицу по 1-му столбцу. Вместо этого вы можете сначала вставить элемент отсортированного столбца и сохранить строку этого элемента. Затем вы можете использовать эту строку для вставки всех остальных элементов. Мне было проще просто отключить и снова включить сортировку. - person Omer; 26.04.2017