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
>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();