Qt中如何在另一个tableView中显示QSqlTableModel过滤后的数据?
How to show the filtered data of QSqlTableModel in another tableView in Qt?
我已经使用 QSqlTableModel
加载了一个数据库,并在 tableView1
中显示了它。现在,我已经为此 QSqlTableModel
设置了一个过滤器,并希望在 tableView2
中显示过滤后的数据。 tableView1
和 tableView2
不应相互影响。那么,如何显示,最快的方法是什么?
注:
- 数据库只有number没有string,维度也不大(500*5左右);
tableView2
中的数据不需要存储
主要代码如下:
QSqlTableModel *model = new QSqlTableModel(NULL, db);
model->setTable(tableName);
model->select();
tableView->setModel(model);
tableView->show();
model->setFilter("colum5 > 10");
我不想把过滤后的数据写到另一个数据库中,然后存储,展示。我想找到一些更好的方式来展示它。或者,我是否需要将过滤后的数据提取到一个矩阵中,并将这个矩阵显示在tableView
中?谁能提供一些想法?谢谢
因为你想显示两个模型,我认为最干净的方法是使用 QSortFilterProxyModel
subclass (I will refer to it as model2
) in tableView2
, override filterAcceptsRow()
to accept only rows with column5 > 10
, and set its source model 到 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);
但这不会使您的 table 视图同步。当用户编辑 table 视图之一时,您将必须更新另一个视图。
我已经使用 QSqlTableModel
加载了一个数据库,并在 tableView1
中显示了它。现在,我已经为此 QSqlTableModel
设置了一个过滤器,并希望在 tableView2
中显示过滤后的数据。 tableView1
和 tableView2
不应相互影响。那么,如何显示,最快的方法是什么?
注:
- 数据库只有number没有string,维度也不大(500*5左右);
tableView2
中的数据不需要存储
主要代码如下:
QSqlTableModel *model = new QSqlTableModel(NULL, db);
model->setTable(tableName);
model->select();
tableView->setModel(model);
tableView->show();
model->setFilter("colum5 > 10");
我不想把过滤后的数据写到另一个数据库中,然后存储,展示。我想找到一些更好的方式来展示它。或者,我是否需要将过滤后的数据提取到一个矩阵中,并将这个矩阵显示在tableView
中?谁能提供一些想法?谢谢
因为你想显示两个模型,我认为最干净的方法是使用 QSortFilterProxyModel
subclass (I will refer to it as model2
) in tableView2
, override filterAcceptsRow()
to accept only rows with column5 > 10
, and set its source model 到 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);
但这不会使您的 table 视图同步。当用户编辑 table 视图之一时,您将必须更新另一个视图。