`
qimo601
  • 浏览: 3445966 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

(四)Qt实现自定义模型基于QAbstractTableModel

    博客分类:
  • Qt
阅读更多

 

目录:

(一) Qt Model/View 的简单说明 、预定义模型

(二)使用预定义模型 QstringListModel例子

(三)使用预定义模型QDirModel的例子

(四)Qt实现自定义模型基于QAbstractTableModel

(五)Qt实现自定义模型基于QAbstractItemModel 

(六) Qt实现自定义委托 QDelegate

 

Qt实现自定义模型基于QAbstractTableModel

两个例子

 

 

例子1代码

 

Main.cpp

#include <QtGui>

#include "currencymodel.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    //数据源
    QMap<QString, double> currencyMap;
    currencyMap.insert("AUD", 1.3259);
    currencyMap.insert("CHF", 1.2970);
    currencyMap.insert("CZK", 24.510);
    currencyMap.insert("DKK", 6.2168);
    currencyMap.insert("EUR", 0.8333);
    currencyMap.insert("GBP", 0.5661);
    currencyMap.insert("HKD", 7.7562);
    currencyMap.insert("JPY", 112.92);
    currencyMap.insert("NOK", 6.5200);
    currencyMap.insert("NZD", 1.4697);
    currencyMap.insert("SEK", 7.8180);
    currencyMap.insert("SGD", 1.6901);
    currencyMap.insert("USD", 1.0000);

    //自定义表模型
    CurrencyModel currencyModel;
    currencyModel.setCurrencyMap(currencyMap);
    //表视图
    QTableView tableView;
    //设置视图模型
    tableView.setModel(&currencyModel);
    //设置交替颜色
    tableView.setAlternatingRowColors(true);

    tableView.setWindowTitle(QObject::tr("Currencies"));
    tableView.show();

    return app.exec();
}



currencymodel.h

#ifndef CURRENCYMODEL_H
#define CURRENCYMODEL_H

#include <QAbstractTableModel>
#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;

private:
    QString currencyAt(int offset) const;

    QMap<QString, double> currencyMap;
};

#endif

 

currencymodel.cpp

#include <QtCore>

#include "currencymodel.h"

CurrencyModel::CurrencyModel(QObject *parent)
    : QAbstractTableModel(parent)
{
}

void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
    currencyMap = map;
    //重置模型至原始状态,告诉所有视图,他们数据都无效,强制刷新数据
    reset();
}

//返回行数
int CurrencyModel::rowCount(const QModelIndex & /* parent */) const
{
    return currencyMap.count();
}
//返回列数
int CurrencyModel::columnCount(const QModelIndex & /* parent */) const
{
    return currencyMap.count();
}

//返回一个项的任意角色的值,这个项被指定为QModelIndex
QVariant CurrencyModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::TextAlignmentRole) {
        return int(Qt::AlignRight | Qt::AlignVCenter);
    } 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::headerData(int section,
                                   Qt::Orientation /* orientation */,
                                   int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();
    return currencyAt(section);
}
//获取当前关键字
QString CurrencyModel::currencyAt(int offset) const
{
    return (currencyMap.begin() + offset).key();
}

 

例子2代码

 

Main.cpp

#include <QApplication>
#include <QHeaderView>
#include <QTableView>

#include "citymodel.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    //保存城市名
    QStringList cities;
    cities << "Arvika" << "Boden" << "Eskilstuna" << "Falun"
           << "Filipstad" << "Halmstad" << "Helsingborg" << "Karlstad"
           << "Kiruna" << "Kramfors" << "Motala" << "Sandviken"
           << "Skara" << "Stockholm" << "Sundsvall" << "Trelleborg";
    //模型
    CityModel cityModel;
    //
    cityModel.setCities(cities);

    QTableView tableView;
    tableView.setModel(&cityModel);
    tableView.setAlternatingRowColors(true);
    tableView.setWindowTitle(QObject::tr("Cities"));
    tableView.show();

    return app.exec();
}

 

 

citymodel.h

#ifndef CITYMODEL_H
#define CITYMODEL_H

#include <QAbstractTableModel>
#include <QStringList>
#include <QVector>

class CityModel : public QAbstractTableModel
{
    Q_OBJECT

public:
    CityModel(QObject *parent = 0);

    void setCities(const QStringList &cityNames);
    int rowCount(const QModelIndex &parent) const;
    int columnCount(const QModelIndex &parent) const;
    QVariant data(const QModelIndex &index, int role) const;
    bool setData(const QModelIndex &index, const QVariant &value,
                 int role);
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;

private:
    int offsetOf(int row, int column) const;

    QStringList cities;
    QVector<int> distances;
};

#endif

 

 

citymodel.cpp

#include <QtCore>

#include "citymodel.h"

CityModel::CityModel(QObject *parent)
    : QAbstractTableModel(parent)
{
}
//设定一下数据源
void CityModel::setCities(const QStringList &cityNames)
{
    cities = cityNames;
    //重新设置一下QVector distances的矩阵大小的,中间对角线为0不用存
    distances.resize(cities.count() * (cities.count() - 1) / 2);
    //填充所有距离值为0
    distances.fill(0);
    //刷新所有视图数据
    reset();
}
//模型行数
int CityModel::rowCount(const QModelIndex & /* parent */) const
{
    return cities.count();
}
//模型列数
int CityModel::columnCount(const QModelIndex & /* parent */) const
{
    return cities.count();
}
//赋值模型每个项的数据
QVariant CityModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (role == Qt::TextAlignmentRole) {
        return int(Qt::AlignRight | Qt::AlignVCenter);
    } else if (role == Qt::DisplayRole) {
        if (index.row() == index.column())
            return 0;
        int offset = offsetOf(index.row(), index.column());
        return distances[offset];
    }
    return QVariant();
}
//编辑一个项
bool CityModel::setData(const QModelIndex &index,
                        const QVariant &value, int role)
{
    if (index.isValid() && index.row() != index.column()
            && role == Qt::EditRole) {
        int offset = offsetOf(index.row(), index.column());
        distances[offset] = value.toInt();
        //交换对应项的模型索引
        QModelIndex transposedIndex = createIndex(index.column(),
                                                  index.row());
        //某项发生改变,发射信号( between topLeft and bottomRight inclusive)
        emit dataChanged(index, index);
        emit dataChanged(transposedIndex, transposedIndex);
        return true;
    }
    return false;
}

//返回列表头
QVariant CityModel::headerData(int section,
                               Qt::Orientation /* orientation */,
                               int role) const
{
    //返回在Cities字符串列表中给定偏移量的城市名称
    if (role == Qt::DisplayRole)
        return cities[section];
    return QVariant();
}
//返回对一个项相关的操作的标识符(例如,是否可以编辑或者是否已选中等)
Qt::ItemFlags CityModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags flags = QAbstractItemModel::flags(index);
    if (index.row() != index.column())
        flags |= Qt::ItemIsEditable;
    return flags;
}
//计算偏移量
int CityModel::offsetOf(int row, int column) const
{
    if (row < column)
        qSwap(row, column);
    return (row * (row - 1) / 2) + column;
}

 

0
0
分享到:
评论

相关推荐

    QT-QabstractTableModel模型、重写sort方法排序

    在标题提到的"QT-QabstractTableModel模型、重写sort方法排序"中,我们关注的重点是如何利用`QAbstractTableModel`来实现自定义排序功能。`sort`方法是`QAbstractItemModel`的一部分,它允许对模型中的数据进行排序...

    QT 自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现

    在本项目"QT自定义混合控件——基于View/Model/Delegate的QTableView/QTreewidget/Combobox实现"中,我们将深入探讨如何利用QT库中的核心组件构建一个强大的数据展示和交互界面。 首先,我们要理解View/Model/...

    Qt托管类实现自定义tableview中的checkbox等

    过滤后的文件信息(如路径、名称、大小等)可以存储在自定义模型中,随后更新到`QTableView`上。 ### 总结 通过以上步骤,我们可以构建一个具备自定义复选框功能的`QTableView`,并展示扫描到的特定类型文件。使用...

    QTableView-MODEL VIEW 自定义模型实现.rar

    总结起来,"QTableView-MODEL VIEW 自定义模型实现"是一个关于如何在Qt环境中使用自定义数据模型驱动QTableView的教程或示例。通过自定义模型,开发者可以灵活地处理各种复杂的数据源,同时保持Qt的Model/View架构的...

    qt 自定义tablemodel和使用sqlmodel的例子

    本文将深入探讨如何自定义`QAbstractTableModel`以及如何使用`QSqlTableModel`,这两个都是Qt提供的重要数据模型类。我们将通过分析"qt 自定义tablemodel和使用sqlmodel的例子"中的`TableModelView.zip`和`...

    QT实现可拖拽排序的表格

    在QT编程中,创建一个可拖拽...总的来说,实现QT中可拖拽排序的表格涉及多方面的技术,包括事件处理、数据模型操作、自定义视图以及样式设置。理解并掌握这些知识点,对于提升QT应用的用户体验和功能完整性至关重要。

    Qt之模型/视图(实时更新数据)

    1. 定义自定义模型类,继承自QAbstractTableModel或QStandardItemModel,实现数据的添加、更新和删除方法,并覆盖`data()`、`flags()`等方法以提供数据访问。 2. 创建视图(QTableView),设置相应的模型,并可能...

    QT5分页组件,可以实现简单的数据分页

    总结起来,QT5分页组件是通过自定义控件、信号与槽机制以及与数据模型的交互来实现的。它简化了大量数据的显示,并提供了良好的用户体验。通过学习和实践,开发者可以熟练掌握这一功能,提升应用程序的易用性。

    Qt课程表界面

    2. **数据模型与视图**:在Qt中,数据通常通过数据模型(如QStandardItemModel或QAbstractTableModel)来管理,视图(如QTableView)则用于显示模型中的数据。课程表可能采用这种模式,将课程数据存储在一个模型中,...

    QML_QAbstractTableModel.zip

    `QAbstractTableModel`是Qt的一个核心组件,它允许我们自定义数据模型,从而可以方便地与QML进行数据交互。 首先,让我们了解`QAbstractTableModel`。它是`QAbstractItemModel`的一个子类,专门设计用于表格视图...

    Qt QTableWidget 基本功能及排序功能

    虽然QTableWidget提供了基本的排序功能,但若需要更复杂的数据结构和排序逻辑,可能需要创建自定义的QAbstractTableModel子类,重写`data()`, `headerData()`, `sort()`等方法。 6. **样式与显示**: 可以通过`...

    基于QT实现的简单的停车场管理系统.zip

    开发者可能使用了QT的QAbstractTableModel或QSqlModel来创建自定义的数据模型。 2. 控制器:这部分代码负责处理用户输入,如点击按钮,以及更新视图和模型。这通常涉及到信号和槽机制,QT的一个关键特性,它使得对象...

    Qt中的tablewidget 通过分页方式加载大量数据

    - 创建一个继承自QAbstractTableModel的自定义模型类,实现必要的方法如rowCount()、columnCount()、data()等,以满足数据的读取需求。 - 在模型类中维护一个当前页的数据列表,以及总行数和每页行数的信息。 - ...

    Qt tableview实现翻页,翻页后选中,选中删除,全部删除,模糊搜索,跳转

    数据模型可以是自定义的`QAbstractTableModel`子类,或者使用`QStandardItemModel`。例如: ```cpp QStandardItemModel *model = new QStandardItemModel(this); tableView-&gt;setModel(model); ``` **翻页功能**:...

    毕设项目:基于C++、QT实现的带GUI的图书管理系统.zip

    在QT中,我们可以利用QStandardItemModel或自定义的QAbstractTableModel子类来表示数据,并通过对话框让用户输入信息。 查询功能则需要提供多种查询条件,如书名、作者等。QT的QSortFilterProxyModel可以帮助我们...

    Qt Tableview显示数据

    对于自定义模型,你需要重写`QAbstractTableModel`的相关方法如`rowCount()`, `columnCount()`, `data()`, `headerData()`等。 **4. 显示列头** 如果需要显示列头,`QTableView`会自动从模型的`headerData()`方法...

    自己开发的集成qabstracttablemodel的派生类,

    在压缩包文件`CTableModelTest`中,可能包含了这个自定义模型类的源代码、测试用例或者其他相关资源,用于展示如何使用这个派生类。分析这些文件可以帮助深入理解该模型的实现细节和使用方式。 总之,开发一个`...

    Qt 筛选框的实现 含头文件和cpp文件

    在Qt编程中,为了增强用户界面的交互性和实用性,我们经常需要实现各种定制化的...熟悉Qt的信号和槽机制、自定义部件以及数据模型的操作是实现这一功能的关键。希望这些知识点能对你在Qt开发中实现类似功能有所帮助。

    QT在QTableView的一列里添加两个按钮

    QTableView是QT中的一个关键组件,它用于展示表格数据,通常与QAbstractItemModel或QSqlTableModel等模型类配合使用。在QTableView中添加自定义元素,如按钮,可以实现更丰富的用户交互。 在QT中,要在QTableView的...

Global site tag (gtag.js) - Google Analytics