Саммерфилд Марк
Шрифт:
Слот copy соответствует пункту меню Edit | Copy (Правка | Копировать). Он в цикле обрабатывает всю выделенную область ячеек (если нет явно выделенной области, то ею будет просто текущая ячейка). Формула каждой выделенной ячейки добавляется в QString, причем строки отделяются символом новой строки, а столбцы разделяются символом табуляции.
Доступ к буферу обмена в Qt осуществляется при помощи статической функции QApplication::clipboard. Вызывая функцию QClipboard::setText, мы делаем текст доступным через буфер обмена; причем этот текст могут использовать и данное, и другие приложения, поддерживающие работу с простыми текстами. Применяемый нами формат со знаками табуляции и новой строки в качестве разделителей понятен многим приложениям, включая Excel от компании Microsoft.
Рис. 4.5. Копирование выделенных ячеек в буфер обмена.
Функция QTableWidget::selectedRange возвращает список выделенных диапазонов. Мы знаем, что может быть не более одного диапазона, потому что мы задали в конструкторе режим выделения QAbstractItemView::ContiguousSelection. Для удобства мы определяем функцию selectedRange, которая возвращает выделенный диапазон:
Если выделение вообще имеет место, мы возвращаем первую (и единственную) выделенную область. Мы никогда не встретимся с ситуацией, когда не выбрано никакой области, поскольку в режиме ContiguousSelection текущая ячейка рассматривается как выделенная. Однако такую ситуацию мы все же обрабатываем, чтобы защититься от ошибки в нашей программе, приводящей к отсутствию текущей ячейки.
Слот paste соответствует пункту меню Edit | Paste (Правка | Вставить). Мы считываем текст из буфера обмена и вызываем статическую функцию QString::split для разбиения строки и представления ее в виде списка QStringList. Каждая строка таблицы представлена в этом списке одной строкой.