03 const TableMimeData *tableData =

04 qobject_cast(event->mimeData());

05 if (tableData) {

06 const QTableWidget *otherTable = tableData->tableWidget();

07 QTableWidgetSelectionRange otherRange = tableData->range();

08 …

09 event->acceptProposedAction();

10 } else if (event->mimeData()->hasFormat("text/csv")) {

11 QByteArray csvData = event->mimeData()->data("text/csv");

12 QString csvText = QString::fromUtf8(csVData);

13 …

14 event->acceptProposedAction();

15 } else if (event->mimeData()->hasFormat("text/plain")) {

16 QString plainText = event->mimeData()->text();

17 …

18 event->acceptProposedAction();

19 }

20 QTableWidget::mouseMoveEvent(event);

21 }

Функция dropEvent() аналогична функции с тем же названием, которую мы рассматривали ранее в данном разделе, но на этот раз мы ее оптимизируем, делая вначале проверку возможности приведения типа QMimeData в тип TableMimeData. Если qobject_cast() срабатывает, это значит, что перенос был инициирован виджетом MyTableWidget, расположенным в том же самом приложении, и мы можем получить непосредственный доступ к данным таблицы вместо того, чтобы пробираться сквозь программный интерфейс класса QMimeData. Если приведение типов оказывается неудачным, мы извлекаем данные стандартным способом.

В этом примере мы кодировали CSV—текст, используя кодировку UTF-8. Если бы мы хотели быть уверенными в применении правильной кодировки, мы могли бы использовать параметр charset в MIME—типе text/plain для явного задания типа кодировки. Ниже приводится несколько примеров:

text/plain; charset=US-ASCII

text/plain; charset=ISO-8859-1

text/plain; charset=Shift_JIS

text/plain; charset=UTF-8

<p>Работа с буфером обмена</p>

Большинство приложений тем или иным образом используют встроенные в Qt средства работы с буфером обмена. Например, класс QTextEdit обеспечивает поддержку слотов cut(), copy() и paste(), а также клавиш быстрого вызова команд, и поэтому дополнительное программирование почти (или совсем) не требуется.

При создании нами собственных классов мы можем осуществлять доступ к буферу обмена с помощью функции QApplication::clipboard(), которая возвращает указатель на объект приложения QClipboard. Обработка системного буфера обмена выполняется просто: вызывайте функции setText(), setImage() или setPixmap() для помещения данных в буфер обмена, и функции text(), image() или pixmap() для считывания данных из буфера обмена. Мы уже приводили примеры работы с буфером обмена в приложении Электронная таблица из главы 4.

Для некоторых приложений может оказаться недостаточно встроенных функциональных возможностей. Например, нам могут потребоваться данные, которые не являются просто текстом или изображением, или мы захотим обеспечить работу с многими различными форматами данных с целью достижения максимальной совместимости с другими приложениями. Эта проблема очень напоминает ту, с которой мы столкнулись при обеспечении механизма «drag-and-drop», и решение также будет аналогичным: мы можем создать подкласс QMimeData и переопределить несколько виртуальных функций.

Если наше приложение поддерживает механизм «drag-and-drop» через пользовательский подкласс QMimeData, мы можем просто повторно использовать пользовательский подкласс QMimeData и помещать его в буфер обмена, используя функцию setMimeData(). Для получения данных мы можем вызвать функцию mimeData() для буфера обмена.

Перейти на страницу:

Похожие книги