Саммерфилд Марк
Шрифт:
Затем мы определяем размеры области копирования. Номер строки в таблице является номером строки в QStringList; номер столбца является номером символа табуляции в первой строке плюс 1. Если выделена только одна ячейка, мы используем ее в качестве верхнего левого угла области вставки; в противном случае мы используем текущую выделенную область для вставки.
При выполнении операции вставки мы в цикле проходим по строкам и разбиваем каждую строку на значения ячеек, снова используя функцию QString::split, но теперь в качестве разделителя применяется знак табуляции. Рис. 4.6 иллюстрирует эти действия.
Рис. 4.6. Вставка текста из буфера обмена в электронную таблицу.
Слот del соответствует пункту меню Edit | Delete (Правка | Удалить). Для очистки ячеек достаточно использовать оператор delete для каждого объекта Cell. Объект QTableWidget замечает, когда удаляются его элементы QTableWidgetltem, и автоматически перерисовывает себя, если какой-нибудь из элементов оказывается видимым. Если мы вызываем функцию cell, указывая координаты удаленной ячейки, то она возвратит нулевой указатель.
Функции selectCurrentRow и selectCurrentColumn соответствуют пунктам меню Edit | Select | Row и Edit | Select | Column (Правка | Выделить | Строка и Правка | Выделить | Столбец). Здесь используется реализация функций selectRow и selectColumn класса QTableWidget. Нам не требуется реализовывать функциональность пункта меню Edit | Select | All (Правка | Выделить | Все), поскольку она обеспечивается в QTableWidget унаследованной функцией QAbstractItemView::selectAll.
Слот findNext в цикле просматривает ячейки, начиная с ячейки, расположенной правее курсора, и двигается вправо до достижения последнего столбца; затем процесс идет с первого столбца строки, расположенной ниже, и так продолжается, пока не будет найден требуемый текст или пока не будет достигнута самая последняя ячейка. Например, если текущей является ячейка C24, поиск будет продолжаться по ячейкам D24, E24, … Z24, затем no A25, B25, C25, … Z25 и так далее, пока не будет достигнута ячейка Z999. Если соответствующее значение найдено, мы сбрасываем текущее выделение и перемещаем курсор на ячейку, в которой оно находится, и делаем активным окно, содержащее эту электронную таблицу Spreadsheet. При неудачном завершении поиска мы заставляем приложение выдать соответствующий звуковой сигнал.
Слот findPrevious похож на findNext, но здесь цикл выполняется в обратном направлении и заканчивается в ячейке A1.
Реализация других меню
Теперь мы реализуем слоты для пунктов меню Tools и Options.
Рис. 4.7. Меню Tools и Options приложения Электронная таблица.