Qt实现自定义模型基于QAbstractTableModel

 

Qt实现自定义模型基于QAbstractTableModel

两个例子

 

 

例子1代码

 

Main.cpp

Cpp代码   收藏代码
  1. #include <QtGui>  
  2.   
  3. #include "currencymodel.h"  
  4.   
  5. int main(int argc, char *argv[])  
  6. {  
  7.     QApplication app(argc, argv);  
  8.   
  9.     //数据源  
  10.     QMap<QString, double> currencyMap;  
  11.     currencyMap.insert("AUD", 1.3259);  
  12.     currencyMap.insert("CHF", 1.2970);  
  13.     currencyMap.insert("CZK", 24.510);  
  14.     currencyMap.insert("DKK", 6.2168);  
  15.     currencyMap.insert("EUR", 0.8333);  
  16.     currencyMap.insert("GBP", 0.5661);  
  17.     currencyMap.insert("HKD", 7.7562);  
  18.     currencyMap.insert("JPY", 112.92);  
  19.     currencyMap.insert("NOK", 6.5200);  
  20.     currencyMap.insert("NZD", 1.4697);  
  21.     currencyMap.insert("SEK", 7.8180);  
  22.     currencyMap.insert("SGD", 1.6901);  
  23.     currencyMap.insert("USD", 1.0000);  
  24.   
  25.     //自定义表模型  
  26.     CurrencyModel currencyModel;  
  27.     currencyModel.setCurrencyMap(currencyMap);  
  28.     //表视图  
  29.     QTableView tableView;  
  30.     //设置视图模型  
  31.     tableView.setModel(&currencyModel);  
  32.     //设置交替颜色  
  33.     tableView.setAlternatingRowColors(true);  
  34.   
  35.     tableView.setWindowTitle(QObject::tr("Currencies"));  
  36.     tableView.show();  
  37.   
  38.     return app.exec();  
  39. }  



currencymodel.h

Cpp代码   收藏代码
  1. #ifndef CURRENCYMODEL_H  
  2. #define CURRENCYMODEL_H  
  3.   
  4. #include <QAbstractTableModel>  
  5. #include <QMap>  
  6.   
  7. class CurrencyModel : public QAbstractTableModel  
  8. {  
  9. public:  
  10.     CurrencyModel(QObject *parent = 0);  
  11.   
  12.     void setCurrencyMap(const QMap<QString, double> &map);  
  13.     int rowCount(const QModelIndex &parent) const;  
  14.     int columnCount(const QModelIndex &parent) const;  
  15.     QVariant data(const QModelIndex &index, int role) const;  
  16.     QVariant headerData(int section, Qt::Orientation orientation,  
  17.                         int role) const;  
  18.   
  19. private:  
  20.     QString currencyAt(int offset) const;  
  21.   
  22.     QMap<QString, double> currencyMap;  
  23. };  
  24.   
  25. #endif  

 

currencymodel.cpp

Cpp代码   收藏代码
  1. #include <QtCore>  
  2.   
  3. #include "currencymodel.h"  
  4.   
  5. CurrencyModel::CurrencyModel(QObject *parent)  
  6.     : QAbstractTableModel(parent)  
  7. {  
  8. }  
  9.   
  10. void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)  
  11. {  
  12.     currencyMap = map;  
  13.     //重置模型至原始状态,告诉所有视图,他们数据都无效,强制刷新数据  
  14.     reset();  
  15. }  
  16.   
  17. //返回行数  
  18. int CurrencyModel::rowCount(const QModelIndex & /* parent */const  
  19. {  
  20.     return currencyMap.count();  
  21. }  
  22. //返回列数  
  23. int CurrencyModel::columnCount(const QModelIndex & /* parent */const  
  24. {  
  25.     return currencyMap.count();  
  26. }  
  27.   
  28. //返回一个项的任意角色的值,这个项被指定为QModelIndex  
  29. QVariant CurrencyModel::data(const QModelIndex &index, int role) const  
  30. {  
  31.     if (!index.isValid())  
  32.         return QVariant();  
  33.   
  34.     if (role == Qt::TextAlignmentRole) {  
  35.         return int(Qt::AlignRight | Qt::AlignVCenter);  
  36.     } else if (role == Qt::DisplayRole) {  
  37.         QString rowCurrency = currencyAt(index.row());  
  38.         QString columnCurrency = currencyAt(index.column());  
  39.   
  40.         if (currencyMap.value(rowCurrency) == 0.0)  
  41.             return "####";  
  42.   
  43.         double amount = currencyMap.value(columnCurrency)  
  44.                         / currencyMap.value(rowCurrency);  
  45.   
  46.         return QString("%1").arg(amount, 0, 'f', 4);  
  47.     }  
  48.     return QVariant();  
  49. }  
  50. //返回表头名称,(行号或列号,水平或垂直,角色)  
  51. QVariant CurrencyModel::headerData(int section,  
  52.                                    Qt::Orientation /* orientation */,  
  53.                                    int role) const  
  54. {  
  55.     if (role != Qt::DisplayRole)  
  56.         return QVariant();  
  57.     return currencyAt(section);  
  58. }  
  59. //获取当前关键字  
  60. QString CurrencyModel::currencyAt(int offset) const  
  61. {  
  62.     return (currencyMap.begin() + offset).key();  
  63. }  

 

 

例子2代码

 

Main.cpp

Cpp代码   收藏代码
  1. #include <QApplication>  
  2. #include <QHeaderView>  
  3. #include <QTableView>  
  4.   
  5. #include "citymodel.h"  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     QApplication app(argc, argv);  
  10.   
  11.     //保存城市名  
  12.     QStringList cities;  
  13.     cities << "Arvika" << "Boden" << "Eskilstuna" << "Falun"  
  14.            << "Filipstad" << "Halmstad" << "Helsingborg" << "Karlstad"  
  15.            << "Kiruna" << "Kramfors" << "Motala" << "Sandviken"  
  16.            << "Skara" << "Stockholm" << "Sundsvall" << "Trelleborg";  
  17.     //模型  
  18.     CityModel cityModel;  
  19.     //  
  20.     cityModel.setCities(cities);  
  21.   
  22.     QTableView tableView;  
  23.     tableView.setModel(&cityModel);  
  24.     tableView.setAlternatingRowColors(true);  
  25.     tableView.setWindowTitle(QObject::tr("Cities"));  
  26.     tableView.show();  
  27.   
  28.     return app.exec();  
  29. }  

 

 

citymodel.h

Cpp代码   收藏代码
  1. #ifndef CITYMODEL_H  
  2. #define CITYMODEL_H  
  3.   
  4. #include <QAbstractTableModel>  
  5. #include <QStringList>  
  6. #include <QVector>  
  7.   
  8. class CityModel : public QAbstractTableModel  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     CityModel(QObject *parent = 0);  
  14.   
  15.     void setCities(const QStringList &cityNames);  
  16.     int rowCount(const QModelIndex &parent) const;  
  17.     int columnCount(const QModelIndex &parent) const;  
  18.     QVariant data(const QModelIndex &index, int role) const;  
  19.     bool setData(const QModelIndex &index, const QVariant &value,  
  20.                  int role);  
  21.     QVariant headerData(int section, Qt::Orientation orientation,  
  22.                         int role) const;  
  23.     Qt::ItemFlags flags(const QModelIndex &index) const;  
  24.   
  25. private:  
  26.     int offsetOf(int row, int column) const;  
  27.   
  28.     QStringList cities;  
  29.     QVector<int> distances;  
  30. };  
  31.   
  32. #endif  

 

 

citymodel.cpp

Cpp代码   收藏代码
  1. #include <QtCore>  
  2.   
  3. #include "citymodel.h"  
  4.   
  5. CityModel::CityModel(QObject *parent)  
  6.     : QAbstractTableModel(parent)  
  7. {  
  8. }  
  9. //设定一下数据源  
  10. void CityModel::setCities(const QStringList &cityNames)  
  11. {  
  12.     cities = cityNames;  
  13.     //重新设置一下QVector distances的矩阵大小的,中间对角线为0不用存  
  14.     distances.resize(cities.count() * (cities.count() - 1) / 2);  
  15.     //填充所有距离值为0  
  16.     distances.fill(0);  
  17.     //刷新所有视图数据  
  18.     reset();  
  19. }  
  20. //模型行数  
  21. int CityModel::rowCount(const QModelIndex & /* parent */const  
  22. {  
  23.     return cities.count();  
  24. }  
  25. //模型列数  
  26. int CityModel::columnCount(const QModelIndex & /* parent */const  
  27. {  
  28.     return cities.count();  
  29. }  
  30. //赋值模型每个项的数据  
  31. QVariant CityModel::data(const QModelIndex &index, int role) const  
  32. {  
  33.     if (!index.isValid())  
  34.         return QVariant();  
  35.   
  36.     if (role == Qt::TextAlignmentRole) {  
  37.         return int(Qt::AlignRight | Qt::AlignVCenter);  
  38.     } else if (role == Qt::DisplayRole) {  
  39.         if (index.row() == index.column())  
  40.             return 0;  
  41.         int offset = offsetOf(index.row(), index.column());  
  42.         return distances[offset];  
  43.     }  
  44.     return QVariant();  
  45. }  
  46. //编辑一个项  
  47. bool CityModel::setData(const QModelIndex &index,  
  48.                         const QVariant &value, int role)  
  49. {  
  50.     if (index.isValid() && index.row() != index.column()  
  51.             && role == Qt::EditRole) {  
  52.         int offset = offsetOf(index.row(), index.column());  
  53.         distances[offset] = value.toInt();  
  54.         //交换对应项的模型索引  
  55.         QModelIndex transposedIndex = createIndex(index.column(),  
  56.                                                   index.row());  
  57.         //某项发生改变,发射信号( between topLeft and bottomRight inclusive)  
  58.         emit dataChanged(index, index);  
  59.         emit dataChanged(transposedIndex, transposedIndex);  
  60.         return true;  
  61.     }  
  62.     return false;  
  63. }  
  64.   
  65. //返回列表头  
  66. QVariant CityModel::headerData(int section,  
  67.                                Qt::Orientation /* orientation */,  
  68.                                int role) const  
  69. {  
  70.     //返回在Cities字符串列表中给定偏移量的城市名称  
  71.     if (role == Qt::DisplayRole)  
  72.         return cities[section];  
  73.     return QVariant();  
  74. }  
  75. //返回对一个项相关的操作的标识符(例如,是否可以编辑或者是否已选中等)  
  76. Qt::ItemFlags CityModel::flags(const QModelIndex &index) const  
  77. {  
  78.     Qt::ItemFlags flags = QAbstractItemModel::flags(index);  
  79.     if (index.row() != index.column())  
  80.         flags |= Qt::ItemIsEditable;  
  81.     return flags;  
  82. }  
  83. //计算偏移量  
  84. int CityModel::offsetOf(int row, int column) const  
  85. {  
  86.     if (row < column)  
  87.         qSwap(row, column);  
  88.     return (row * (row - 1) / 2) + column;  
  89. }  

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中,QTableView是一种用于显示表格数据的控件,而QAbstractTableModelQTableView使用的一种数据模型。如果想要在QTableView中展示自定义的数据,需要自定义一个继承自QAbstractTableModel的数据模型自定义QAbstractTableModel需要实现以下几个方法: 1. rowCount():返回数据模型中的行数。 2. columnCount():返回数据模型中的列数。 3. data():返回某一项的数据,可以用来在QTableView中展示数据。 4. setData():设置某一项的数据,可以用来在QTableView中编辑数据。 5. headerData():返回行或列的标签,可以用来在QTableView中显示表头。 6. flags():返回某一项的标志,用来指定该项是否可编辑、是否可选中等。 自定义QAbstractTableModel类后,可以将其与QTableView关联,通过setModel()方法来设置数据模型,使QTableView显示自定义的数据。 下面是一个简单的自定义QAbstractTableModel的例子: ```c++ class MyTableModel : public QAbstractTableModel { public: MyTableModel(QObject *parent = nullptr); int rowCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; Qt::ItemFlags flags(const QModelIndex &index) const override; private: QList<QList<QVariant>> m_data; }; ``` 在这个例子中,自定义的数据模型类为MyTableModel,其中实现了rowCount()、columnCount()、data()、setData()、headerData()和flags()方法。m_data变量用于存储数据。自定义的数据模型类可以在需要使用表格数据的地方创建,并通过setModel()方法将其与QTableView关联起来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值