На этом шаге рассмотрим реализацию подкласса QTableWidgetItem.
Теперь мы перейдем к написанию cell.срр:
Cell::Cell() { /*В конструкторе нам необходимо установить признак "dirty" ("грязный") только для кеша. Передавать родительский объект нет необходимости; когда делается вставка ячейки в QTableWidget с помощью setltem(); QTableWidget автоматически станет ее владельцем*/ setDirty(); /*Каждый элемент QTableWidgetltem может иметь некоторые данные - до одного типа QVariant на каждую «роль» данных. Наиболее распространенными ролями являются Qt:: EditRole и Qt:: DisplayRole (роль правки и роль отображения). Роль правки используется для данных, которые должны редактироваться, а роль отображения, для данных, которые должны отображаться на экране. Часто обе роли используются для одних и тех же данных, однако в Cell роль правки соответствует формуле ячейки, а роль отображения - значению ячейки (результату вычисления формулы)*/ }
Функция clone() вызывается в QTableWidget, когда необходимо создать новую ячейку, например, когда пользователь начинает вводить данные в пустую ячейку, которая до сих пор не использовалась.
QTableWidgetItem *Cell::clone() const
{
/*Переданный функции QTableWidget::setItemPrototype() экземпляр
является дубликатом. Поскольку для копирования Cell можно ограничиться
функцией-членом, мы полагаемся на используемый по умолчанию конструктор
копирования, автоматически создаваемый C++ при создании экземпляров новых
ячеек Cell в функции clone()*/
return new Cell(*this);
}
Функция setFormula() задает формулу ячейки. Это просто удобная функция для вызова setData() с указанием роли правки. Она вызывается из функции Spreadsheet::setFormula().
void Cell::setData(int role, const QVariant &value) { QTableWidgetItem::setData(role, value); if (role == Qt::EditRole) setDirty(); } void Cell::setFormula(const QString &formula) { setData(Qt::EditRole, formula); }
Функция formula() вызывается из Spreadsheet::formula(). Подобно setFormula() этой функцией удобно пользоваться на этот раз для получения данных EditRole заданного элемента.
QString Cell::formula() const { return data(Qt::EditRole).toString(); }
Функция setDirty() вызывается для принудительного перерасчета значения ячейки. Она просто устанавливает флажок cachelsDirty на значение true, указывая на то, что значение cachedValue больше не отражает текущее состояние. Перерасчет не будет выполняться до тех пор, пока он не станет действительно необходим.
void Cell::setDirty() { cacheIsDirty = true; }
Функция data() класса QTableWidgetItem переопределяется.
QVariant Cell::data(int role) const { /*возвращает текст, который должен отображаться в электронной таблице, если в вызове указана роль Qt::DisplayRole. При задании роли DisplayRole, она использует функцию value() для расчета значения ячейки. Если нельзя получить достоверное значение (из-за того, что формула неверна), мы возвращаем значение "####"*/ if (role == Qt::DisplayRole) { if (value().isValid()) { return value().toString(); } else { return "####"; } } /*обеспечивает подходящее выравнивание, если вызывается с ролью Qt::TextAlignmentRole*/ else if (role == Qt::TextAlignmentRole) { if (value().type() == QVariant::String) { return int(Qt::AlignLeft | Qt::AlignVCenter); } else { return int(Qt::AlignRight | Qt::AlignVCenter); } } else { //или формулу, если в вызове указана роль Qt::EditRole return QTableWidgetItem::data(role); } }
На следующем шаге продолжим рассматривать реализацию класса Cell.