Шаг 180.
Библиотека Qt.
Создание подкласса QTableWidgetItem

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




Предыдущий шаг Содержание Следующий шаг