gpt4 book ai didi

c++ - QSortFilterProxyModel 限制应用过滤器时的记录数

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:45 26 4
gpt4 key购买 nike

QSortFilterProxyModel 似乎限制了可以在 QTableView 中显示的数据量,但仅限于应用过滤器时。似乎限制是数据大小而不是记录数,因为我可以在此处的示例中放入比我看到该行为的实际应用程序更多的记录。

按照以下步骤进行复制(在 Linux 中,安装了 Sqlite)。下面提供了代码。

  1. 使用提供的代码创建一个新项目。
  2. 在包含可执行文件的目录中,键入:sqlite3 testInsert.db
  3. 在 sqlite 提示符中,键入:create table testTable(id integer primary key autoincrement, name text);
  4. 运行应用程序并看到记录 5000 testString 出现在 TableView 中。
  5. 将 numRecords 变量增加到 511。(也许您的特定数字会有所不同??)
  6. 在 sqlite 提示符中,键入:drop table testTable
  7. 重做第 3 步
  8. 运行看看这次记录5000没有出现
  9. 重做第 6 步(删除表),然后重做第 3 步(创建表)。可能有更简单的方法来清理 table ,但这对我有用。
  10. 在靠近代码底部的地方,调用了模型的 SetFilterRegExp 方法。注释该行。
  11. 再次运行。在结果中,向下滚动到底部,看到记录 5000 确实出现了。

示例代码:

#include <QApplication>    
#include <QDebug>
#include <QTableView>
#include <QtSql>

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

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("./testInsert.db");
db.open();


QSqlRelationalTableModel *model = new QSqlRelationalTableModel(NULL, db);
model->setTable("testTable");

// put a bunch of dummy records into the database
int numRecords = 510;
for(int i=0; i<numRecords; i++)
{
QSqlRecord newRecord;
QSqlField name("NAME", QVariant::String);
name.setValue("unmatchedString");
newRecord.append(name);
model->insertRecord(-1, newRecord);
}

// put in the record we want to see
QSqlRecord record;
QSqlField id("ID", QVariant::Int);
QSqlField name("NAME", QVariant::String);
id.setValue(5000);
name.setValue("testString");
record.append(id);
record.append(name);
model->insertRecord(-1, record);
model->select();

QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel;
proxyModel->setSourceModel(model);
proxyModel->setFilterKeyColumn(1);

QRegExp filterRegExp = QRegExp("^testString$");
proxyModel->setFilterRegExp(filterRegExp); // <<-- this is the line to comment out

QTableView tableView;
tableView.setModel(proxyModel);
tableView.show();

return a.exec();
}

更新:也在另一台运行 Windows 的机器上复制。我还注意到,在我提供的示例中,在应该显示但没有显示单个记录的情况下,我实际上可以通过调整主窗口的大小来显示它。在我第一次发现这个问题的实际应用程序中,调整大小不会导致出现丢失的记录。

最佳答案

我能够重现该问题。我可以让行显示的唯一方法是添加行:

proxyModel->invalidate();

tableView.show() 被调用之后。然而,据我所知,这不是必需的。

关于c++ - QSortFilterProxyModel 限制应用过滤器时的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com