2
QSortFilterProxyModel似乎限制了可以在QTableView中顯示的數據量,但僅限於應用過濾器時。似乎限制是數據大小而不是記錄數量,因爲我可以在這裏的示例中填充更多的記錄,而不是我看到行爲的實際應用程序。QSortFilterProxyModel限制應用過濾器時的記錄數
重複以下步驟(在Linux中,安裝Sqlite)。代碼如下。
- 使用提供的代碼創建一個新項目。
- 在與可執行,類型的目錄:sqlite3的testInsert.db
- 在源碼提示,類型:創建表TestTable的(ID整數主鍵自動增量,名稱文本);
- 運行該應用程序並查看該記錄5000,testString,出現在表視圖中。
- 遞增的變量numRecords〜511(也許你的具體數目將變化??)
- 在源碼提示,類型:DROP TABLE TestTable的
- 重做步驟3
- 運行和看到,這一次記錄5000確實不是出現
- 重做第6步(放置表),然後第3步(創建表)。可能有一種更簡單的方法來清理桌子,但這對我來說很有用。
- 靠近代碼底部,有一個對模型的SetFilterRegExp方法的調用。評論線。
- 再次運行。在結果中,向下滾動到底部,看到記錄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另一臺機器上。我還注意到,在我提供的例子中,在單個記錄應該顯示但不是的情況下,我實際上可以通過調整主窗口的大小來顯示它。在我第一次發現此問題的實際應用程序中,調整大小不會導致缺少的記錄出現。