【4】QT自定义模型

作者: 业余玩家 | 来源:发表于2017-01-17 21:32 被阅读161次

    在聊学习之前,想说一下将近一个星期的时间我都干了些什么,为什么没有学习,总结起来一个字——玩,11号朋友远道而来,说是在家闲得慌,过来找我一起浪,直到昨天才将他送走,既然朋友来了,自然不能怠慢,请他吃饭,带他闲逛,一起去爬山,还吃了一天的自制火锅,回想起来这味道有点反胃。独处的时候适合学习和思考,玩耍的时候就该和朋友一起。

    学习内容依然参考豆子博主的教程,然后将实例实现一遍,今天QT的内容不多,只在上午的时候学习了一些,下午的时候看了一些关于c++的教学视频,主要是对一些基础知识的总结与归纳。

    自定义编辑模型
    //currencymodel.h
    #ifndef CURRENCYMODEL_H
    #define CURRENCYMODEL_H
    #include <QAbstractTableModel>
    #include <QVariant>
    #include <QMap>
    
    class CurrencyModel:public QAbstractTableModel
    {
    public:
        CurrencyModel(QObject *parent=0);
        void setCurrencyMap(const QMap<QString,double> &map);
        int rowCount(const QModelIndex &parent) const;
        int columnCount(const QModelIndex &parent) const;
        QVariant data(const QModelIndex &index,int role) const;
        QVariant headerData(int section, Qt::Orientation orientation, int role) const;
        //可编辑模型实现
        Qt::ItemFlags flags(const QModelIndex &index)const;
        bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole);
    
    private:
        QString currencyAt(int offset) const;
        QMap<QString,double> currencyMap;
    };
    
    #endif // CURRENCYMODEL_H
    
    //currencymodel.cpp
    #include "currencymodel.h"
    
    CurrencyModel::CurrencyModel(QObject *parent):QAbstractTableModel(parent)
    {
    
    }
    //返回行数目
    int CurrencyModel::rowCount(const QModelIndex &parent) const
    {
        return currencyMap.count();
    }
    //返回列数目
    int CurrencyModel::columnCount(const QModelIndex &parent) const
    {
        return currencyMap.count();
    }
    //返回列名
    //QVariant类将大部分类型(int,string)的数据封装起来,调用时使用to函数取出,例如:int类型包装成QVariant,用QVariant::toInt()取出
    QVariant CurrencyModel::headerData(int section, Qt::Orientation, int role) const
    {
        if(role !=Qt::DisplayRole){
            return QVariant();
        }
        return currencyAt(section);
    }
    QString CurrencyModel::currencyAt(int offset) const
    {
        return (currencyMap.begin()+offset).key();
    }
    
    //设置底层的实际数据,由于不可能将数据硬编码,所以必须为模型提供一个用于设置的函数
    void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
    {
        //两个函数为重置内部数据做准备
        beginResetModel();
        currencyMap=map;
        endResetModel();
    }
    
    //返回单元格数据(只读模型)
    //QVariant CurrencyModel::data(const QModelIndex &index,int role) const
    //{
    //    if(!index.isValid()){
    //        return QVariant();
    //    }
    
    //    if(role==Qt::TextAlignmentRole){
    //        return int(Qt::DisplayRole | Qt::AlignCenter);
    //    }else if(role==Qt::DisplayRole){
    //        QString rowCurrency=currencyAt(index.row());
    //        QString columnCurrency=currencyAt(index.column());
    //        if(currencyMap.value(rowCurrency)==0.0){
    //            return "####";
    //        }
    //        double amount=currencyMap.value(columnCurrency)/currencyMap.value(rowCurrency);
    //        return QString("%1").arg(amount,0,'f',4);
    //    }
    //    return QVariant();
    //}
    
    //(可编辑模型)
    QVariant CurrencyModel::data(const QModelIndex &index,int role) const
    {
        if(!index.isValid()){
            return QVariant();
        }
    
        if(role==Qt::TextAlignmentRole){
            return int(Qt::DisplayRole | Qt::AlignCenter);
        }else if(role==Qt::DisplayRole || role==Qt::EditRole){
            QString rowCurrency=currencyAt(index.row());
            QString columnCurrency=currencyAt(index.column());
            if(currencyMap.value(rowCurrency)==0.0){
                return "####";
            }
            double amount=currencyMap.value(columnCurrency)/currencyMap.value(rowCurrency);
            return QString("%1").arg(amount,0,'f',4);
        }
        return QVariant();
    }
    
    
    //可编辑模型函数实现
    Qt::ItemFlags CurrencyModel::flags(const QModelIndex &index) const
    {
        Qt::ItemFlags flags=QAbstractItemModel::flags(index);
        if(index.row()!=index.column()){
            //按位或
            flags |= Qt::ItemIsEditable;
        }
        return flags;
    }
    
    //更新数据
    bool CurrencyModel::setData(const QModelIndex &index, const QVariant &value, int role)
    {
        if(index.isValid()&&index.row()!=index.column()&&role==Qt::EditRole){
            QString columnCurrency=headerData(index.column(),Qt::Horizontal,Qt::DisplayRole).toString();
            QString rowCurrency=headerData(index.row(),Qt::Vertical,Qt::DisplayRole).toString();
            currencyMap.insert(columnCurrency,value.toDouble()*currencyMap.value(rowCurrency));
            emit dataChanged(index,index);
            return true;
        }
        return false;
    }
    
    //main.cpp
    #include <QApplication>
    #include <currencymodel.h>
    #include <QTableView>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
    
        QMap<QString,double> data;
        data["USD"]=1.0000;
        data["CNY"]=0.1628;
        data["GBP"]=1.5361;
        data["EUR"]=1.2992;
        data["HKD"]=0.1289;
    
        QTableView view;
        CurrencyModel *model=new CurrencyModel(&view);
        model->setCurrencyMap(data);
        view.setModel(model);
        view.resize(400,300);
        view.show();
    
        return a.exec();
    }
    

    备注:当类里面有一个成员函数没有实现的时候,无法编译通过的。

    相关文章

      网友评论

        本文标题:【4】QT自定义模型

        本文链接:https://www.haomeiwen.com/subject/iiqvbttx.html