我使用QSqlTableModel
加载了数据库,并在tableView1
中显示。现在,我已为此QSqlTableModel
设置了过滤器,并希望在tableView2
中显示已过滤的数据。 tableView1
和tableView2
不应相互影响。然后,如何展示它,以及最快的方式是什么?
注意:
tableView2
中的数据。主要代码如下:
QSqlTableModel *model = new QSqlTableModel(NULL, db);
model->setTable(tableName);
model->select();
tableView->setModel(model);
tableView->show();
model->setFilter("colum5 > 10");
我不想将filtred数据写入另一个数据库,然后存储它,显示它。我想找到一些更好的方式来展示它。或者,我是否需要在矩阵中提取过滤后的数据,并在tableView
中显示此矩阵?谁能提供一些想法?谢谢
答案 0 :(得分:2)
由于你想要显示两个模型,我认为最简洁的方法就是在{{1}中使用QSortFilterProxyModel
子类(我将其称为model2
) },覆盖filterAcceptsRow()
仅接受tableView2
行,并将其source model设置为column5 > 10
(原始model1
)。
这将使两个模型同步,任何一个模型的编辑将自动应用于两个模型。
以下是QSqlTableModel
子类的外观:
QSortFilterProxyModel
你可以像这样使用它:
class MyFilterModel : public QSortFilterProxyModel{
public:
explicit MyFilterModel(QObject* parent= nullptr):QSortFilterProxyModel(parent){}
~MyFilterModel(){}
void setCol5Min(int val){
col5Min= val;
invalidateFilter();
}
protected:
bool filterAcceptsRow(int source_row, const QModelIndex &/*source_parent*/) const{
//get index using source_row, and the column you want to filter
QModelIndex index4= sourceModel()->index(source_row, 4);
//accept the row only when col5's value is greater than col5Min
return (sourceModel()->data(index4).toInt() > col5Min);
}
private:
int col5Min;
};
上述方法的唯一缺点是过滤不在数据库中执行(它在您的应用程序代码中完成),因此您无法利用您可能的任何索引以QSqlTableModel *model1 = new QSqlTableModel(this, db);
model1->setTable(tableName);
model1->select();
tableView1->setModel(model1);
MyFilterModel* model2= new MyFilterModel(this);
model2->setCol5Min(10);
model2->setSourceModel(&model1);
tableView2->setModel(model2);
为例(但如果你有500行,这根本不是问题)。
如果您希望在数据库中执行过滤,则必须使用两个单独的col5
:
QSqlTableModel
但这不会使您的表视图同步。当用户编辑其中一个表视图时,您必须更新另一个。