Читаем QT 4: программирование GUI на С++ полностью

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

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 }

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных