Давайте начнем с реализации виджета и сначала приведем заголовочный файл:
01 #ifndef SPREADSHEET_H
02 #define SPREADSHEET_H
03 #include <QTableWidget>
04 class Cell;
05 class SpreadsheetCompare;
Заголовочный файл начинается с предварительных объявлений классов Cell и SpreadsheetCompare.
Рис. 4.1.
Деревья наследования для классов Spreadsheet и Cell.
Такие атрибуты ячейки QTableWidget, как ее текст и выравнивание, хранятся в QTableWidgetltem. В отличие от QTableWidget, класс QTableWidgetltem не является виджетом; это обычный класс данных. Класс Cell наследует QTableWidgetltem, и мы рассмотрим этот класс в последнем разделе данной главы, где представим его реализацию.
Функция autoRecalculate реализуется как встроенная (inline), поскольку она лишь показывает, задействован или нет режим автоматического перерасчета.
В главе 3 мы опирались на использование некоторых открытых функций класса электронной таблицы Spreadsheet при реализации MainWindow Например, из MainWindow::newFile мы вызывали функцию clear для очистки электронной таблицы. Кроме того, мы вызывали некоторые функции, унаследованные от QTableWidget, а именно setCurrentCell и setShowGrid.
содержит много слотов, которые реализуют действия пунктов меню Edit, Tools и Options, и он содержит один сигал modified для уведомления о возникновении любого изменения.
32 private slots:
33 void somethingChanged;
Мы определяем один закрытый слот, который используется внутри класса Spreadsheet.
Заголовочный файл заканчивается определением класса SpreadsheetCompare. Мы объясним назначение этого класса при рассмотрении функции Spreadsheet::sort.
Обычно при вводе пользователем некоторого текста в пустую ячейку QTableWidget будет автоматически создавать элемент QTableWidgetltem для хранения этого текста. Вместо этого мы хотим, чтобы создавались элементы Cell. Это достигается с помощью вызова в конструкторе функции setItemPrototype. Всякий раз, когда требуется новый элемент, QTableWidget дублирует элемент, переданный в качестве прототипа.