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

时间:2014-02-25 22:30:29

标签: c++ qt sqlite

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

要复制,请执行以下步骤(在Linux中,安装了Sqlite)。代码如下。

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

    #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的另一台计算机上重复。我还注意到,在我提供的示例中,在单个记录应该显示但不显示的情况下,我实际上可以通过调整主窗口的大小来显示它。在我第一次发现此问题的实际应用程序中,调整大小不会导致丢失的记录出现。

1 个答案:

答案 0 :(得分:2)

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

proxyModel->invalidate();
调用tableView.show()

据我所知,这不应该是必要的。