На этом шаге рассмотрим создание подкласса 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.