QT 4: программирование GUI на С++ | страница 74



>02 {

>03 QTableWidgetSelectionRange range = selectedRange();

>04 QString str;

>05 for (int i = 0; i < range.rowCount(); ++i) {

>06 if (i > 0)

>07 str += "\n";

>08 for (int j = 0; j < range.columnCount(); ++j) {

>09 if (j > 0)

>10 str += "\t";

>11 str += formula(range.topRow() + i, range.leftColumn() + j);

>12 }

>13 }

>14 QApplication::clipboard()->setText(str);

>15 }

Слот copy() соответствует пункту меню Edit | Copy (Правка | Копировать). Он в цикле обрабатывает всю выделенную область ячеек (если нет явно выделенной области, то ею будет просто текущая ячейка). Формула каждой выделенной ячейки добавляется в QString, причем строки отделяются символом новой строки, а столбцы разделяются символом табуляции.

Доступ к буферу обмена в Qt осуществляется при помощи статической функции QApplication::clipboard(). Вызывая функцию QClipboard::setText(), мы делаем текст доступным через буфер обмена; причем этот текст могут использовать и данное, и другие приложения, поддерживающие работу с простыми текстами. Применяемый нами формат со знаками табуляции и новой строки в качестве разделителей понятен многим приложениям, включая Excel от компании Microsoft.

Рис. 4.5. Копирование выделенных ячеек в буфер обмена.

Функция QTableWidget::selectedRange() возвращает список выделенных диапазонов. Мы знаем, что может быть не более одного диапазона, потому что мы задали в конструкторе режим выделения QAbstractItemView::ContiguousSelection. Для удобства мы определяем функцию selectedRange(), которая возвращает выделенный диапазон:

>01 QTableWidgetSelectionRange Spreadsheet::selectedRange() const

>02 {

>03 QList ranges = selectedRanges();

>04 if (ranges.isEmpty())

>05 return QTableWidgetSelectionRange();

>06 return ranges.first();

>07 }

Если выделение вообще имеет место, мы возвращаем первую (и единственную) выделенную область. Мы никогда не встретимся с ситуацией, когда не выбрано никакой области, поскольку в режиме ContiguousSelection текущая ячейка рассматривается как выделенная. Однако такую ситуацию мы все же обрабатываем, чтобы защититься от ошибки в нашей программе, приводящей к отсутствию текущей ячейки.

>01 void Spreadsheet::paste()

>02 {

>03 QTableWidgetSelectionRange range = selectedRange();

>04 QString str = QApplication::clipboard()->text();