На этом шаге рассмотрим создание подкласса QTableWidgetItem.
Класс Cell наследует QTableWidgetItem. Этот класс спроектирован для удобства работы с Spreadsheet, но он не имеет никаких особых связей с данным классом электронной таблицы и теоретически может применяться для любого объекта QTableWidget. Ниже приводится заголовочный файл.
#ifndef CELL_H #define CELL_H #include <QTableWidgetItem> class Cell : public QTableWidgetItem { public: Cell(); QTableWidgetItem *clone() const; void setData(int role, const QVariant &value); QVariant data(int role) const; void setFormula(const QString &formula); QString formula() const; void setDirty(); private: QVariant value() const; QVariant evalExpression(const QString &str, int &pos) const; QVariant evalTerm(const QString &str, int &pos) const; QVariant evalFactor(const QString &str, int &pos) const; /*Класс Cell расширяет QTableWidgetItem, добавляя две закрытые переменные: переменная cachedValue кеширует значение ячейки в виде значения типа QVariant*/ mutable QVariant cachedValue; /*переменная cachelsDirty принимает значение true, если кешируемое значение устарело*/ mutable bool cacheIsDirty; /*Мы используем QVariant, поскольку некоторые ячейки имеют тип числа двойной точности double, а другие имеют тип строки QString. При объявлении переменных cachedValue и cachelsDirty используется ключевое слово mutable языка C++. Это позволяет нам модифицировать эти переменные в функциях с модификатором const*/ }; #endif
В определении класса не используется макрос Q_OBJECT. Класс Cell является "чистым" классом C++, который не имеет сигналов и слотов. На самом деле из-за того, что QTableWidgetItem не происходит от QObject, мы не можем использовать в Cell как таковые сигналы и слоты. Классы элементов Qt не наследуют QObject, чтобы свести к минимуму затраты на их обработку. Если сигналы и слоты необходимы, они могут быть реализованы в виджете, содержащем элементы, или (в виде исключения) при помощи множественного наследования класса QObject.
На следующем шаге рассмотрим реализацию класса Cell.