- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我的类 DataTable 派生自 QAbstractTableModel。它在内部使用 QSqlTableModel 对象从数据库表中获取数据。它代表 db 中每一行的记录(它做的更多,但记录计数始终是 db 表中的行数)。
使用 MySql,我的 DataTable::rowCount() 实现只是在 QSqlTableModel 上调用 rowCount(),它运行良好。
现在使用 SQLite,如果 db 表中的行数超过 256,Qt 的 SQLite 驱动程序将返回 256 的行数,因此我的 DataTable 类也返回 256 - 这是错误的。 documentation叫我打电话while (sql_model->canFetchMore()) sql_model->fetchMore();
.在创建内部 QSqlTableModel 之后立即调用 fetchMore() 实际上会导致以下 rowCount() 调用返回正确的值。但是一旦数据库中的某些内容发生更改(我的类将在 QSqlTableModel 上调用 insertRow() 或 setData()),下一个 QSqlTableModel::rowCount() 调用将再次返回 256。
数据库仅由我的类修改,它反过来使用特定的 QSqlTableModel 对象(或使用我的 DataTable 作为模型的 View ,可以更新某些内容)。所以没有其他进程可以将行插入到数据库中。
那么我的 DataTable 类何时应该为 rowCount() 调用 fetchMore() 以始终返回实际的行数?
我认为我的类(class)应该将 QSqlTableModel 发出的一些信号连接到一个会调用 fetchMore() 的插槽,尽管 我不确定这是否是正确/可靠的方法?
更新 :
下面是一些代码来演示基本问题。
QSqlTableModel *model = new QSqlTableModel(0, database); //QSqlDatabase
model->setTable("tablename");
qDebug() << "0 row count" << model->rowCount(); //0 row count 0
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->select();
qDebug() << "1 row count" << model->rowCount(); //1 row count 256
while (model->canFetchMore()) model->fetchMore();
qDebug() << "2 row count" << model->rowCount(); //2 row count 1520
//... other methods ...
model->setData(model->index(0, 0), "TEST");
model->submitAll();
qDebug() << "3 row count" << model->rowCount(); //3 row count 256
while (model->canFetchMore()) model->fetchMore();
qDebug() << "4 row count" << model->rowCount(); //4 row count 1520
SELECT COUNT
理论上对数据库的 SQL 查询,但这并不能回答问题。只要能避免SQL,我就不会写SQL。在我看来,发送这样的 SQL 查询违背了面向对象的 QAbstractTableModel 类的目的。加上 rowCount() 是 const (不应该发送查询)并且应该很快。无论如何,这不会修复 rowCount()。
assert(!sql_model->canFetchMore())
I would probably try to use dataChanged signal.
)是不够的。我已将其连接到
dataChanged(const QModelIndex&, const QModelIndex&)
,
rowsInserted(const QModelIndex&, int, int)
,
rowsRemoved(const QModelIndex&, int, int)
和
layoutChanged()
.
最佳答案
你面临的困境和我最近遇到的类似。我写了一个 QT gui 程序,它做了以下事情——
一世。连接和查询 Oracle 数据库
ii.在 QTableView 中显示查询结果
三、将 QTableView 的结果导出到 .csv 文件
四、将 .csv 文件导入 loacl sqlite3 数据库
v. 连接并查询本地sqlite3数据库
六.执行查询并在另一个 QTableview 中显示结果
在步骤 ii.,(即将结果导出到 .csv)我观察到,虽然在 QTableView 上生成了 543 条记录,但只有 256 条记录被导出到 .csv 文件。
我在用,
int rows=model->rowCount();
int columns=model->columnCount();
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
textData += model->data(model->index(i,j)).toString();
textData += ", "; // for .csv file format
}
textData += "\n"; // (optional: for new line segmentation)
}
QFile csvfile("/home/aj/ora_exported.csv");
if(csvfile.open(QIODevice::WriteOnly|QIODevice::Truncate))
{
QTextStream out(&csvfile);
out<<textData;
}
csvfile.close();
while (model->canFetchMore())
model->fetchMore();
int rows=model->rowCount();
int columns=model->columnCount();
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
textData += model->data(model->index(i,j)).toString();
textData += ", "; // for .csv file format
}
textData += "\n"; // (optional: for new line segmentation)
}
关于qt - 何时或如何在 QSqlTableModel 上使用 fetchMore() 和 SQLite 数据库让 rowCount() 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369420/
子类化 QSQLTableModel 并重写数据方法: class SclDataModel(QSqlTableModel): def __init__(self, parent=None):
我正在尝试继承 QSqlTableModel 以使我的表格中的数据以我需要的方式显示。 class TableViewModel(QSqlTableModel): def __init__(s
如果一条记录已被另一个数据库客户端插入到 mysql 表中,我如何收到通知,这可能吗? 最佳答案 void QSqlTableModel::beforeInsert(QSqlRecord &recor
我正在尝试添加始终为空的最后一行。现在我有代理模型,我在其上调用 insertRow() - 插入行。但是当更新最后一行(插入数据)时,我需要添加另一行。我应该连接到哪个信号? 有时会出现奇怪的错误
我正在尝试在 qt c++ 中访问 mysql 数据库。 我有不同的表格,想将它们输出到 QTableView 上。 我使用 QSqlTableModel,效果很好,但是当我想过滤结果时,我遇到了问题
我正在尝试从 ODBC 源 (informix db) 加载和显示数据。我可以创建并打开连接。但是我在使用 QSqlTableModel 时遇到了一些问题。下面的代码编译和运行没有错误,但不显示任何数
当一行要被编辑时,一个索引被传递到编辑对话框中。 编辑工作正常。 当我想添加一行时,我没有将索引传递给对话构造函数,因此它知道它应该添加一个新行。 这是对对话按钮使用react的函数代码 void D
阅读QSqlTableModel documentation我看到两种获取模型的方法: QSqlTableModel *model = new QSqlTableModel(parentObject,
如果我这样做: QSqlQuery searchQuery(QString("select * from people where id = %1").arg(1)); if (searchQuery
我有派生自 QSqlRelationalTableModel 的类。我使用 SQLite 数据库。我需要更改数据库文件。我关闭旧的数据库文件,调用 SetDatabaseName("path to n
我正在使用 QSqlTableModel 和 QTableView 来查看 SQLite 数据库表。 我希望表每隔一秒左右自动刷新一次(它不会是一个非常大的表 - 几百行)。我可以这样做——就像这样:
我将 QTableView 与 QSqlTableModel 一起使用。在我看来,我不显示包含记录 ID 的列。如果未显示在任何列中,如何获取所选行的 id? 感谢帮助 :) 最佳答案 你也可以直接从
我正在尝试将一个信号分配给一个按钮,以便它调用一个过滤并在 tableView 上显示特定数据的函数。 但是当我点击按钮时它说: Type error: setFilter(self, str) to
我有一个QTableView和QSqlTableModel。当我更新QTableView中的单元格时,我正在调用“ submitall”函数来更新数据库。 “ Submitall”已激活,但数据库中没
我的同事发现了 QSqlTableModel 的下一个问题: #define VARIANT_1 class SomeClass : public QWidget { Q_OBJECT pub
我看过很多讨论类似问题的教程/解释,但我不知道如何将其应用于这种情况。 我是一名 Qt/C++ 新手,正在尝试构建连接到一个简单的 GUI 应用程序SQLite 数据库。我有 UI 表单,它是使用 Q
我有一个包含重复记录的表。 我使用以下代码将数据放入 QTableView 中: QSqlTableModel *dataModel = new QSqlTableModel(); dataModel
我有一个连接到 MySQL 数据库的 PyQt5 应用程序。我制作了连接到同一模型的两个 View 。 View 从数据库中提取数据就好了。我对一个字段中的任何字段所做的任何更改都会反射(reflec
我有一个 tableView 示例: 比如当数据列状态为S时。表格的背景颜色为绿色,when N 为红色。 我想要的例子: 我的代码: MainWindow::MainWindow(QWidget *
我正在尝试更新一条记录,我有这个: tableModel->select(); QModelIndex index = ui.tableView->currentIndex(); QString sq
我是一名优秀的程序员,十分优秀!