解决QTableModel 只能加载少量数据(约256条)的问题

连续一周了,给孩子做的背单词程序不能录入需要识记的单词,之前是正常使用的,以为自己优化程序时误触了哪段脚本,导致单词不能正常录入。一遍一遍的跟踪调试,才发现,我使用QTableModel 写入数据库的模式,对数据量是有限制的。

原来的思路:

在这里插入图片描述

问题出在了第一步

多次调试发现,QTableModel查出来的数据记录条数与单词表中的记录数不一致,单词表中是266条,但QTableModel中查出的记录,很多时候只有256条,有时也能达到262条。这种不稳定性,一度让我认为我的电脑硬件影响了查询结果。

因为QTableModel查出的记录条数(256条)和数据库中的记录条数(266条)不一致,所以语句self.tableModelWord.insertRow(266, QModelIndex()) 执行失败,导致数据不能正常插入。

解决方案

【错误方法】
在QTableModel所查出的256条记录之后,直接插入需要新增加的记录,然后提交。结果出现了严重的问题:
== 数据库中的表只有257条记录了!QTableModel没有查出的记录全丢了。==
幸好我有备份,否则真是惨了。

【正确方法】
百度了一个不错的方法,链接如下: https://blog.csdn.net/Heaven_Evil/article/details/78616984?spm=1001.2014.3001.5506

在QTableModel的select 之后,增加了一个判断canFetchMore(),即能获得到更多,就获得到更多:

        self.tableModelWord = QtSql.QSqlTableModel()
        self.tableModelWord.setTable('words')
        self.tableModelWord.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允许字段更改
        self.tableModelWord.select()  # 这一句很重要
        while self.tableModelWord.canFetchMore():
            self.tableModelWord.fetchMore()

问题终于解决!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,可以通过实现 QAbstractTableModel 类来创建一个自定义的数据模型,并将其绑定到 QTableView 上。下面是一个简单的示例,演示如何将 QTableView 绑定到一个 SQLite 数据库中的表。 首先,需要包含以下头文件: ```cpp #include <QAbstractTableModel> #include <QSqlDatabase> #include <QSqlQuery> #include <QSqlRecord> #include <QSqlError> ``` 然后,定义一个继承自 QAbstractTableModel 的类,实现其虚函数: ```cpp class MyTableModel : public QAbstractTableModel { public: MyTableModel(QObject *parent = nullptr); // 继承自 QAbstractTableModel 的虚函数 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; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; // 自定义函数 bool bindTable(const QString& tableName); // 绑定数据库表 private: QSqlDatabase m_db; QSqlQuery m_query; int m_rowCount; int m_columnCount; }; ``` 在构造函数中连接到 SQLite 数据库: ```cpp MyTableModel::MyTableModel(QObject *parent) : QAbstractTableModel(parent) { m_db = QSqlDatabase::addDatabase("QSQLITE"); m_db.setDatabaseName("database.db"); if (!m_db.open()) { qWarning() << "Failed to connect to database!"; } } ``` 实现继承自 QAbstractTableModel 的虚函数: ```cpp int MyTableModel::rowCount(const QModelIndex &parent) const { Q_UNUSED(parent); return m_rowCount; } int MyTableModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return m_columnCount; } QVariant MyTableModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) { return QVariant(); } if (role == Qt::DisplayRole) { m_query.seek(index.row()); return m_query.value(index.column()); } return QVariant(); } QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) { return QVariant(); } if (orientation == Qt::Horizontal) { return QString("Column %1").arg(section); } else { return QString("Row %1").arg(section); } } ``` 最后,实现自定义函数 `bindTable`,用于绑定数据库表: ```cpp bool MyTableModel::bindTable(const QString& tableName) { m_query = QSqlQuery(m_db); if (!m_query.exec(QString("SELECT * FROM %1").arg(tableName))) { qWarning() << m_query.lastError().text(); return false; } m_query.last(); m_rowCount = m_query.at() + 1; m_columnCount = m_query.record().count(); beginResetModel(); endResetModel(); return true; } ``` 在主程序中,创建一个 QTableView 和 MyTableModel 的实例,并将其绑定到指定的数据库表: ```cpp QTableView* tableView = new QTableView(); MyTableModel* model = new MyTableModel(); model->bindTable("myTable"); tableView->setModel(model); ``` 这样,QTableView 就会显示数据库表中的数据了。注意,这个示例仅仅是一个简单的演示,实际中还需要处理更多的异常情况和错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值