Ответ Кварка (выбранный) хорош для указания людей в правильном направлении, но его алгоритм совершенно неверен. В дополнение к отключению одной ошибкой и неправильному назначению, это даже не синтаксически правильно. Ниже приведена рабочая версия, которую я только что написал и протестировал.
Давайте предположим, что наш пример таблицы выглядит так:
A | Б | С
D | E | F
Проблема с алгоритмом Кварка заключается в следующем:
Если мы заменим его \ t разделитель на '| ', он выдаст следующее:
B | C | Д
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);
Причина, по которой я решил использовать счетчик вместо итератора, заключается просто в том, что проще проверить, существует ли другой индекс, сверяясь со счетчиком. С итератором, я полагаю, вы могли бы просто увеличить его и сохранить в слабом указателе, чтобы проверить, является ли он действительным, а просто использовать счетчик, как я делал выше.
Нам нужно проверить, будет ли строка next в новой строке. Если мы находимся в новой строке и проверяем предыдущую строку, как это делает алгоритм Кварка, его уже слишком поздно добавлять. Мы могли бы добавить, но тогда мы должны отслеживать последний размер строки. Приведенный выше код выдаст следующий вывод из таблицы примеров:
A | Б | C
D | E | F