2014-02-25 45 views
2

QSortFilterProxyModel似乎限制了可以在QTableView中顯示的數據量,但僅限於應用過濾器時。似乎限制是數據大小而不是記錄數量,因爲我可以在這裏的示例中填充更多的記錄,而不是我看到行爲的實際應用程序。QSortFilterProxyModel限制應用過濾器時的記錄數

重複以下步驟(在Linux中,安裝Sqlite)。代碼如下。

  1. 使用提供的代碼創建一個新項目。
  2. 在與可執行,類型的目錄:sqlite3的testInsert.db
  3. 在源碼提示,類型:創建表TestTable的(ID整數主鍵自動增量,名稱文本);
  4. 運行該應用程序並查看該記錄5000,testString,出現在表視圖中。
  5. 遞增的變量numRecords〜511(也許你的具體數目將變化??)
  6. 在源碼提示,類型:DROP TABLE TestTable的
  7. 重做步驟3
  8. 運行和看到,這一次記錄5000確實不是出現
  9. 重做第6步(放置表),然後第3步(創建表)。可能有一種更簡單的方法來清理桌子,但這對我來說很有用。
  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另一臺機器上。我還注意到,在我提供的例子中,在單個記錄應該顯示但不是的情況下,我實際上可以通過調整主窗口的大小來顯示它。在我第一次發現此問題的實際應用程序中,調整大小不會導致缺少的記錄出現。

回答

1

我能夠重現該問題。我可以得到該行顯示的唯一方法是通過添加一行:tableView.show()被稱爲

proxyModel->invalidate(); 

後。據我所知,這不應該是必要的,但是。