由于您想显示这两个模型,我认为最简洁的方法是在 中使用QSortFilterProxyModel
子类(我将其称为model2
)tableView2
,覆盖filterAcceptsRow()
以仅接受带有 的行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);
上述方法的唯一缺点是过滤不在数据库中执行(它在您的应用程序代码中完成),因此您无法利用您可能拥有的任何索引col5
(但如果您有 500 行,这根本不是问题)。
如果要在数据库中执行过滤,则必须使用两个单独QSqlTableModel
的 s:
QSqlTableModel *model1 = new QSqlTableModel(this, db);
model1->setTable(tableName);
model1->select();
tableView1->setModel(model1);
QSqlTableModel *model2 = new QSqlTableModel(this, db);
model2->setTable(tableName);
model2->setFilter("colum5 > 10");
model2->select();
tableView2->setModel(model2);
但这不会使您的表视图同步。当用户编辑其中一个表视图时,您将不得不更新另一个。