源码下载地址:
http://xvjqpg.bay.livefilestore.com/y1pOj6122_Q9oegUzqx3lQJ_WYdJ_xD995tEqWfcg0YCJzXkwBee1sAhAIfhJGp7-cT8hrSo2x6Gkc3Vy2kxev7EmcrhsEma-aW/Qt%20%E7%94%B5%E5%AD%90%E8%A1%A8%E6%A0%BC%EF%BC%88%E4%BA%8C%EF%BC%89%EF%BC%9A%E6%A0%BC%E5%BC%8F%E5%8C%96%E5%8D%95%E5%85%83%E6%A0%BC%E6%95%B0%E6%8D%AE.rar?download
格式化单元格数据
总结:
当Cell::data() 的role 等于 Qt::DisplayRole 时,你return 什么QString 就显示什么数据
当Cell::data() 的role 等于 Qt::TextAlignmentRole 时,返回对齐方式(return int(Qt::AlignRight | Qt::AlignVCenter);)
并将原始数据(用户输入的数据,公式"=A1+A2",或"1"整数,或是"string" 字符串)处理成你需要的数据格式,保存起来供将来显示用。
当Cell::data() 的role 等于 Qt::EditRole 时,直接返回 QTableWidgetItem::data(role);
必需实现QTableWidgetItem 的clone() 方法(如果不实现clone 后面的data() 方法不会被调用)
virtual QTableWidgetItem *QTableWidgetItem::clone() const;
class Cell : public QTableWidgetItem
Cell *Cell ::clone() const
{
return new Cell(*this);
}
QVariant Cell::data(int role) const
{
...
return QTableWidgetItem::data(role);
}
然后实现QTableWidgetItem 的data() 方法,这样在单元格输入数据时data() 函数被自动调用。
virtual QVariant data(int role) const;
程序一运行:
Spreadsheet::Spreadsheet()
setItemPrototype(new Cell);
Cell::Cell()
在单元格A1 输入数据"1":
Cell::clone()
return new Cell(*this);
Cell::setData()
QTableWidgetItem::setData();
Cell::data()
return QTableWidgetItem::data(role); // role = 2 // EditRole
Cell::data()
return QTableWidgetItem::data(role); // FontRole = 6
Cell::data()
if (role == Qt::TextAlignmentRole) // TextAlignmentRole = 7
if (value().type() == QVariant::String)
Cell::value()
QString formulaStr = formula(); // "1"
return data(Qt::EditRole).toString();
return QTableWidgetItem::data(role);
double d = formulaStr.toDouble(&ok);
if (ok)
cachedValue = d;
return cachedValue;
return int(Qt::AlignRight | Qt::AlignVCenter);
Cell::data() // TextColorRole = 9
// CheckStateRole = 10
// DecorationRole = 1
Cell::data()
if (role == Qt::DisplayRole) // DisplayRole = 0
if (value().isValid())
value()
if (cacheIsDirty) // false
return cachedValue; // double 1
return value().toString();
Cell::data() // BackgroundColorRole = 8
Cell::data() // FontRole = 6
// TextAlignmentRole = 7
// ...
// 以下进入无限循环(至少调试是这样),重复前面的 6, 7, 9, 10, 1, 0 , 8