Для демонстрации этих подходов мы покажем, как можно добавить возможности технологии «drag-and-drop» в виджет QTableWidget. Будет поддерживаться перенос следующих типов MIME: text/plain, text/html и text/csv. При применении первого подхода инициирование переноса выглядит следующим образом:
21 if (drag->start(Qt::CopyAction | Qt::MoveAction) == Qt::MoveAction)
22 deleteSelection;
23 }
Закрытая
функция startDrag вызывается из mouseMoveEvent для инициирования переноса выделенной прямоугольной области. Мы устанавливаем типы MIME text/plain и text/html, используя функции setText и setHtml, а тип text/csv мы устанавливаем функцией setData, которая принимает произвольный тип MIME и массив QByteArray. Программный код для функции selectionAsString более или менее совпадает с кодом функции Spreadsheet::copy, рассмотренной в главе 4.
и toHtml преобразуют строку со знаками табуляции и конца строки в формат CSV (comma—separated values — значения, разделенные запятыми) и HTML соответственно. Например, данные
Red Green Blue
Cyan Yellow Magenta
преобразуются в
"Red", "Green", "Blue"
"Cyan", "Yellow", "Magenta"
или в
<table>
<tr><td>Red<td>Green<td>Blue
<tr><td>Cyan<td>Yellow<td>Magenta
</table>
Преобразование выполняется самым простым из возможных способов с применением функции QString::replace. Для удаления специальных символов формата HTML мы используем функцию Qt::escape.
08 } else if (event->mimeData->hasFormat("text/plain")) {
09 QString plainText = event->mimeData->text;
10 …
11 event->acceptProposedAction;
12 }
13 }
Хотя мы предоставляем данные в трех разных форматах, мы принимаем в dropEvent только два из них. Если подьзователь переносит ячейки из таблицы QTableWidget в редактор HTML, нам нужно, чтобы ячейки были преобразованы в таблицу HTML. Но если пользователь переносит произвольный текст HTML в таблицу QTableWidget, мы не станем его принимать.
Для того чтобы этот пример заработал, нам потребуется также вызвать setAcceptDrops(true) и setSelectionMode(ContiguousSelection) в конструкторе MyTableWidget.