Ответ Кварка (выбранный) полезен для указания людей в правильном направлении, но его алгоритм совершенно неверен. В дополнение к отключению от одной ошибки и некорректному присвоению, он даже не синтаксически корректен. Ниже приведена рабочая версия, которую я только что написал и протестировал.
Давайте предположим, что наш пример таблица выглядит так:
| B | C
D | E | F
Проблема с алгоритмом Quark заключается в следующем:
Если мы заменим его \ т сепаратор с '| ', он будет производить этот выход:
B | C | D
E | F |
Отключение по одной ошибке в том, что D появляется в первой строке. Неправильное присвоение подтверждается отсутствием A
Следующий алгоритм исправляет эти две проблемы с правильным синтаксисом.
QString clipboardString;
QModelIndexList selectedIndexes = view->selectionModel()->selectedIndexes();
for (int i = 0; i < selectedIndexes.count(); ++i)
{
QModelIndex current = selectedIndexes[i];
QString displayText = current.data(Qt::DisplayRole).toString();
// If there exists another column beyond this one.
if (i + 1 < selectedIndexes.count())
{
QModelIndex next = selectedIndexes[i+1];
// If the column is on different row, the clipboard should take note.
if (next.row() != current.row())
{
displayText.append("\n");
}
else
{
// Otherwise append a column separator.
displayText.append(" | ");
}
}
clipboardString.append(displayText);
}
QApplication::clipboard()->setText(clipboardString);
Поэтому я решил использовать счетчик вместо итератора только потому, что легче проверить, если существует другой индекс, проверяя против графа. С итератором, я полагаю, возможно, вы могли бы просто увеличить его и сохранить в слабом указателе, чтобы проверить, действительно ли он действителен, но просто используйте счетчик, как я сделал выше.
Мы должны проверить, будет ли линия следующей линии в новой строке. Если мы находимся на новой строке, и мы проверяем предыдущую строку как алгоритм Quark, ее уже слишком поздно добавлять. Мы могли бы добавить, но тогда нам нужно отслеживать последний размер строки. Вышеприведенный код будет производить следующий результат из таблицы примеров:
A | B | C
D | E | F
извините, но я не понимаю, как использовать QItemSelectionModel и QModelIndexList в этом случае с Model и TableView – Berschi
Здесь вы также можете использовать удобную функцию QAbstractItemView :: selectedIndexes() который доступен в вашем QTableView (в котором QAbstractItemView является родителем). Возвращается простой контейнер списка объектов QModelIndex. – swongu
Я немного расширил пример, чтобы проиллюстрировать, что описывает swongu. – quark