Чтение онлайн

на главную

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

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

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

в буфер обмена.

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

01 QTableWidgetSelectionRange Spreadsheet::selectedRange const

02 {

03 QList<QTableWidgetSelectionRange> 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 }

Слот paste соответствует пункту меню Edit | Paste (Правка | Вставить). Мы считываем текст из буфера обмена и вызываем статическую функцию QString::split для разбиения строки

и представления ее в виде списка QStringList. Каждая строка таблицы представлена в этом списке одной строкой.

Затем мы определяем размеры области копирования. Номер строки в таблице является номером строки в QStringList; номер столбца является номером символа табуляции в первой строке плюс 1. Если выделена только одна ячейка, мы используем ее в качестве верхнего левого угла области вставки; в противном случае мы используем текущую выделенную область для вставки.

При выполнении операции вставки мы в цикле проходим по строкам и разбиваем каждую строку на значения ячеек, снова используя функцию QString::split, но теперь в качестве разделителя применяется знак табуляции. Рис. 4.6 иллюстрирует эти действия.

Рис. 4.6. Вставка текста из буфера обмена в электронную таблицу.

01 void Spreadsheet::del

02 {

03 foreach (QTableWidgetltem *item, selectedItems)

04 delete item;

05 }

Слот del соответствует пункту меню Edit | Delete (Правка | Удалить). Для очистки ячеек достаточно использовать оператор delete для каждого объекта Cell. Объект QTableWidget замечает, когда удаляются его элементы QTableWidgetltem, и автоматически перерисовывает себя, если какой-нибудь из элементов оказывается видимым. Если мы вызываем функцию cell, указывая координаты удаленной ячейки, то она возвратит нулевой указатель.

01 void Spreadsheet::selectCurrentRow

02 {

03 selectRow(currentRow);

04 }

05 void Spreadsheet::selectCurrentColumn

06 {

07 selectColumn(currentColumn);

08 }

Функции selectCurrentRow и selectCurrentColumn соответствуют пунктам меню Edit | Select | Row и Edit | Select | Column (Правка | Выделить | Строка и Правка | Выделить | Столбец). Здесь используется реализация функций selectRow и selectColumn класса QTableWidget. Нам не требуется реализовывать функциональность пункта меню Edit | Select | All (Правка | Выделить | Все), поскольку она обеспечивается в QTableWidget унаследованной функцией QAbstractItemView::selectAll.

01 void Spreadsheet::findNext(const QString &str, Qt::CaseSensitivity cs)

02 {

03 int row = currentRow;

04 int column = currentColumn + 1;

05 while (row < RowCount) {

06 while (column < ColumnCount) {

07 if (text(row, column).contains(str, cs)) {

08 clearSelection;

09 setCurrentCell(row, column);

10 activateWindow;

Поделиться:
Популярные книги

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Звездная Кровь. Изгой

Елисеев Алексей Станиславович
1. Звездная Кровь. Изгой
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Изгой

Хозяин Теней 4

Петров Максим Николаевич
4. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 4

Картофельное счастье попаданки

Иконникова Ольга
Фантастика:
фэнтези
5.00
рейтинг книги
Картофельное счастье попаданки

Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Корнев Павел Николаевич
Фантастика:
фэнтези
героическая фантастика
5.50
рейтинг книги
Экзорцист: Проклятый металл. Жнец. Мор. Осквернитель

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Моя на одну ночь

Тоцка Тала
Любовные романы:
современные любовные романы
короткие любовные романы
5.50
рейтинг книги
Моя на одну ночь

Чехов. Книга 2

Гоблин (MeXXanik)
2. Адвокат Чехов
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Чехов. Книга 2

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Сумеречный стрелок 7

Карелин Сергей Витальевич
7. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок 7

Жизнь под чужим солнцем

Михалкова Елена Ивановна
Детективы:
прочие детективы
9.10
рейтинг книги
Жизнь под чужим солнцем

Красноармеец

Поселягин Владимир Геннадьевич
1. Красноармеец
Фантастика:
боевая фантастика
попаданцы
4.60
рейтинг книги
Красноармеец