Qt 电子表格(二):格式化单元格数据

 

源码下载地址:

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值