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 }
Слот
Доступ к буферу обмена в Qt осуществляется при помощи статической функции
Функция
01 QTableWidgetSelectionRange Spreadsheet::selectedRange() const
02 {
03 QList
04 if (ranges.isEmpty())
05 return QTableWidgetSelectionRange();
06 return ranges.first();
07 }
Если выделение вообще имеет место, мы возвращаем первую (и единственную) выделенную область. Мы никогда не встретимся с ситуацией, когда не выбрано никакой области, поскольку в режиме
01 void Spreadsheet::paste()
02 {
03 QTableWidgetSelectionRange range = selectedRange();
04 QString str = QApplication::clipboard()->text();
05 QStringList rows = str.split('\n');
06 int numRows = rows.count();
07 int numColumns = rows.first().count('\t') + 1;
08 if (range.rowCount() * range.columnCount() != 1
09 && (range.rowCount() != numRows
10 || range.columnCount() !=numColumns)) {
11 QMessageBox::information(this, tr("Spreadsheet"),
12 tr("The information cannot be pasted because the copy "
13 "and paste areas aren't the same size."));
14 return;
15 }
16 for (int i = 0; i < numRows; ++i) {
17 QStringList columns = rows[i].split('\t');
18 for (int j = 0; j < numColumns; ++j) {
19 int row = range.topRow() + i;
20 int column = range.leftColumn() + j;
21 if (row < RowCount && column < ColumnCount)
22 setFormula(row, column, columns[j]);
23 }
24 }
25 somethingChanged();
26 }